{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Load Digits Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_digits\n",
    "\n",
    "digits = load_digits()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, ..., 8, 9, 8])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "digits['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.,  0.,  5., ...,  0.,  0.,  0.],\n",
       "       [ 0.,  0.,  0., ..., 10.,  0.,  0.],\n",
       "       [ 0.,  0.,  0., ..., 16.,  9.,  0.],\n",
       "       ...,\n",
       "       [ 0.,  0.,  1., ...,  6.,  0.,  0.],\n",
       "       [ 0.,  0.,  2., ..., 12.,  0.,  0.],\n",
       "       [ 0.,  0., 10., ..., 12.,  1.,  0.]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "digits['data']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.0, 16.0)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "digits['data'].min(), digits['data'].max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1797, 64)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "digits['data'].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1797,)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "digits['target'].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Displaying Digits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def display_img(img, target, ax, vmin=0, vmax=16):\n",
    "    img = img.reshape((8, 8))\n",
    "    \n",
    "    ax.imshow(img, cmap='gray', vmin=vmin, vmax=vmax)\n",
    "    ax.set_title(f'Digit: {str(target)}')\n",
    "    ax.grid(False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:6: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  \n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x720 with 8 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 8, figsize=(15, 10))\n",
    "\n",
    "for i in range(8):\n",
    "    display_img(digits['data'][i], digits['target'][i], axs[i])\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:7: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  import sys\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 12 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(3, 4, figsize=(10, 10))\n",
    "\n",
    "for i in range(3):\n",
    "    for j in range(4):\n",
    "        display_img(digits['data'][i+j], digits['target'][i+j], axs[i][j])\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Digits Train/Test Split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x, y = digits['data'], digits['target']\n",
    "\n",
    "x_train, x_test, y_train, y_test = train_test_split(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1347, 64), (450, 64), (1347,), (450,))"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape, x_test.shape, y_train.shape, y_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 98.2% [train score: 99.9%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "scaler = StandardScaler()\n",
    "clf = LogisticRegression()\n",
    "\n",
    "x_train_scaled = scaler.fit_transform(x_train)\n",
    "x_test_scaled = scaler.transform(x_test)\n",
    "\n",
    "clf.fit(x_train_scaled, y_train)\n",
    "\n",
    "y_train_pred = clf.predict(x_train_scaled)\n",
    "y_test_pred = clf.predict(x_test_scaled)\n",
    "\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [train score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred)\n",
    "    )\n",
    "    \n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Digits KNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "def apply_and_time(fn, *args):\n",
    "    t1 = time.time()\n",
    "    fn_return = fn(*args)\n",
    "    t2 = time.time()\n",
    "    print(f'Time taken to fit {t2 - t1:.2f}s')\n",
    "    return fn_return"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time taken to fit 0.00s\n",
      "Time taken to fit 0.09s\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=3, metric='euclidean')\n",
    "\n",
    "apply_and_time(clf.fit, x_train, y_train)\n",
    "\n",
    "y_test_pred = apply_and_time(clf.predict, x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=11, metric='manhattan')\n",
    "\n",
    "clf.fit(x_train, y_train)\n",
    "\n",
    "y_train_pred = clf.predict(x_train)\n",
    "y_test_pred = clf.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 97.3% [train score: 98.1%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [train score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred)\n",
    "    )\n",
    "    \n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:9: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  if __name__ == '__main__':\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import plot_confusion_matrix\n",
    "\n",
    "fig, ax = plt.subplots(1, 1, figsize=(8, 8))\n",
    "\n",
    "plot_confusion_matrix(clf, x_test, y_test, cmap='Greys', ax=ax)\n",
    "ax.grid(False)\n",
    "ax.set_label('MNIST Confusion Matrix')\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## K "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1347"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import Binarizer\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "scaler = Binarizer()\n",
    "\n",
    "x_train_high_contrast = scaler.fit_transform(x_train)\n",
    "x_test_high_contrast = scaler.transform(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:16: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  app.launch_new_instance()\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4UAAAEeCAYAAAA97rAJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3df5BdZX3H8c/XRPxJd5mxRn6NCw6lxVqCWlsHC8EitbQloVMZrFjWf3RsabPoDMXOWOJMp9I6tdH+Gi2F0IJNFSU41qrQsrGWahXYjvJDjGGtoSJiyUIZbZry7R/nRJZkkz1Pck/O+dzzfs3cSfbuc8999r733r3PnrvnRmYKAAAAADBMT+t6AgAAAACA7rAoBAAAAIABY1EIAAAAAAPGohAAAAAABoxFIQAAAAAMGItCAAAAABiwsVgURsSmiLil8DLTEbG7rTmhOfp5o583+nmjnzf6eaOfN/rtJTN7eZK0SVLWp/+V9LCkz0m6TNJz9ho7Iemowu0/S9KqRR9fVN0cBzXXZ0q6RtKdknZJ2tb17df1yalfffl1kv5N0n9L+rak90t6Vte3I/0abetnJH1U0g5J35P0NUkbJD2j69uRfvQb9357bffZku6q5/2qrm9H+jXa1tSiuS4+/V7XtyP9Gm2L55/G/erLHy3pw5IerU+bJT2/i9uu73sK/1nVjfVCSWdJul7SJZLuiIhVewZl5kJmPlKy4cz8XmZ+e0TzXKHqzvhBVTFRsegXEeeoelK6WdKpki6U9HOSrhrF9o1Z9JN0uqSvS/pVSadI+m1Jvy5p44i274p+3lz6LfbnqlrCr99aVfPdc7pyxNt349KP559Ls+gXEU+T9AlJJ0h6jaRzJP2IpC0REaO4jiJdr+gPsHLeJOmWJc4/VtJ/Sbpmf2NVvSz29yV9R9Wen82SZiTtXjRmes/HktZo39+SbTrIeW8Qv6mx6ifpOkmf2uu88+vtnND1bUm/g5r/2yR9t+vbkX70G0o/SRdLmpN0sthTaNNPT+4pHGwv5357zW+DeP5p1U/VIjAlnbzovBfX56053Ldd3/cU7iMzH1C14v/leoW9lBlJv6XqicVpql4W+LsH2Oxtqn6DID35W7L10g9eO5wRMXXIk0df+z1T0vf3Ou979b9nHOByg9PTfkuZlPR44WXGHv289bVfRPyYpPeoepXF/zT5Woaor/1qH4qIhyPiSxHxtoh4eoPLDErP+2EZPe13uqT7M/Ori+Z5l6o/p3jVMl/SyNktCmt3SfohSc/bz+ffLumPM/NvMvNrmfleSZ/Z38Yyc5ekhfr/D9anhfrTC5K+qup1yRiNvvX7B0nnRsR5EfG0iDhe0jvrzx3T+Ksajr71e4r6CeqMpD9sepmBoZ+3XvWLiGdL+oikyzPz3uKvZnh61U/V3pDLVC3oz5b015KukHR18y9pUPrWD2X61u9oSQ8ucf6D9ecOK9dF4Z7X2eY+n4iYUPVE/vN7fepfD+aKMvPGzPzR+jcMGI2+9bta0h9I+ltVr82/R9KW+nNPHMz1jrm+9Vt8/SepegDfnJl/ejDXOQD089a3fu+X9OXMZBHRTK/6ZebDmfmezLwtM+cy8/2qfilzUUQcezDXO+Z61Q/F6HcArovCF6tagX/3AGP2CY7e6FW/rLxT0pGq/ij5eZL+vv40B03YV6/67RERPy7ps6raveVwX78R+nnrW7+zJV0QEbvrw7Rvq8+fjYhPH8Z5uOhbv6XcVv/7wk5n0U8O/bB/fev3LUkvWOL8VfXnDiu7RWH9m6s3SPpYZu6zF6febfufkl6516d+eplN76q3v2IU88TS+twvM5/IzAcy8/uqjoT4mA7wsoEh6mu/iPhJSVtVHdb5rZnJD+Ul0M9bT/udo+qozavr07n1+W8Si/un6Gm/pby0/nfHiLY3Foz6YQk97fcvkk6oXyWzZ56nSDpe1dtoHFZ9XxQeEREviIhjIuIlEfFWVbtxH5L0jgNc7o8kzUTEGyLipIiY0ZNH+Nmf++t/z4uIH46I50pSRJwfEfcu9zKKiDglIlarWvEfERGr69MRDb/WcWTRLyKOiojfqBu+JCLeJelySZdm5qMFX++4cel3hqR/lHSTpHdLWlXPe6nfvg0J/bxZ9MvM+zLzK3tOku7bs83MnG/2pY4li35RHQzjjRHx4oh4UURMq3pJ8A2Z+R/Nv9yxY9GvHsfzz3259LtF0h2SrouIV0TET6n6u97Pq/pF6eGVPTh87FInPfXNJ3er2tW7vzef3KR9Dyn7blVvWLnnkLK/I+mxRWOmtegQs/V5G1V9w/zgkLL1uJQ0tcx85xfNd/HpgJcb15NTP0lHqfptzaOqjjr6BUnrur4N6de43+K5PuXU9e1IP/qNe78l5j6lgb/FgVM/Sb8m6cv1dT0u6Sv1PJ/R9e1IP55/DqTf0aoO1vWYquehf6eO3rw+6gmNvYi4WtKpmfmyrueCcvTzRj9v9PNGP2/080Y/b0Pqt7LrCbQhIo5R9ebjt0r6P0m/pOq3YZcc6HLoB/p5o583+nmjnzf6eaOft6H3G8s9hRGxStXu159Q9cbk2yT9SWb+ZacTQyP080Y/b/TzRj9v9PNGP29D7zeWi0IAAAAAQDN9P/ooAAAAAKBFh/w3hQsLC+xq7NDExEQcyuXp1y36eaOfN/p5o583+nmjn7el+rGnEAAAAAAGjEUhAAAAAAxYo5ePRsRrJb1P0gpJV2XmlUuNm5ycHOHUDs6GDRuKxq9Zs6Zo/NzcXOOxGzduLNr2/Px8o3E7d+4s2m6X/dauXVs0/tprry0aX3pbrFu3rvHYktYlnPqVbrPp9/DBji/pV7rtppz6lT4GTU1NFY2fmZkpGt9WkxJO/Upt2bKlaHzpY1zpz9c2dN2v5D5y//33Nx4rSVu3bi0aX6pk7qWPHU3Hd92vROnzw+np6aLxpXMuaTI7O1u07aac+p199tlF4z/84Q+PfA6LXXDBBY3H3nLLLa3MYbl+y+4pjIgVkv5M0s9LOkXS6yPilJHMDq2jnzf6eaOfN/p5o583+nmjn58mLx99haRtmbk9M3dJ2iypbPcPukQ/b/TzRj9v9PNGP2/080Y/M00WhcdK+uaij3fU58ED/bzRzxv9vNHPG/280c8b/cxwoBkAAAAAGLAmi8IHJB2/6OPj6vPggX7e6OeNft7o541+3ujnjX5mmiwKvyjppIg4ISKOkHShpI+3Oy2MEP280c8b/bzRzxv9vNHPG/3MLPuWFJm5OyIukfRpVYeUvToz72p9ZhgJ+nmjnzf6eaOfN/p5o583+vlp9D6FmflJSZ9seS5oCf280c8b/bzRzxv9vNHPG/28NFoUdqn0zc+vuOKKlmZSOfPMMxuPLX0j4T68sfOoXXrppUXjS98cufQ23rRpU+OxpW9cO45K36i29A2PS9/st+T7o3TbLkpug/Xr1xdt+xvf+EbR+JL7k8R9qlTp93Dp7TszM1M0Hu28yfYec3NzReNLH59LlM7FRUm/0vtH6fPVUqtXr248dmpqqr2JmLj55puLxn/kIx9paSaVD3zgA43HvuhFL2pxJvvH0UcBAAAAYMBYFAIAAADAgLEoBAAAAIABY1EIAAAAAAPGohAAAAAABoxFIQAAAAAMGItCAAAAABgwFoUAAAAAMGAsCgEAAABgwFgUAgAAAMCArex6Ass566yzup7CU9x0002Nx87OzrY3ERNnnnlm0fiZmZmi8fPz80XjS0xOThaN37lzZ0sz8bFhw4ai8XfeeWfR+Guvvbbx2HHtV/J1ldxeknTjjTcWjS/dPsqUPh5u3LixaHzp4+eaNWsaj129enXRtkvn3pU2HydKH7O2bNlSNJ7nJGXfl2vXrm1xJuXafL7j4nWve11r277ggguKxp944olF47/+9a83HvvmN7+5aNsf/OAHi8bvD3sKAQAAAGDAWBQCAAAAwIAtuyiMiOMj4taIuDsi7oqI9YdjYhgN+nmjnzf6eaOfN/p5o583+vlp8jeFuyW9PTPviIgjJd0eETdn5t0tzw2jQT9v9PNGP2/080Y/b/TzRj8zy+4pzMxvZeYd9f8fk3SPpGPbnhhGg37e6OeNft7o541+3ujnjX5+iv6mMCKmJJ0m6QttTAbtop83+nmjnzf6eaOfN/p5o5+HxovCiHiupI9KmsnMR9ubEtpAP2/080Y/b/TzRj9v9PNGPx+NFoUR8XRVQa/PzI+1OyWMGv280c8b/bzRzxv9vNHPG/28NDn6aEj6K0n3ZOZ7258SRol+3ujnjX7e6OeNft7o541+fprsKTxd0hslvToi5urTuS3PC6NDP2/080Y/b/TzRj9v9PNGPzPLviVFZn5OUhyGuaAF9PNGP2/080Y/b/TzRj9v9PPT5H0KR2716tWNx65f36/3urzmmmu6noKVrVu3Fo3fsGFD0fidO3cWjS/53ivdNsr9+7//e9H4iYmJxmPPPPPMom3fdNNNReO7cuuttzYee/755xdte2FhoWh8SQ9JmpycbDx2XO9/a9eubTz21FNPLdr2unXrisZPTU0Vjd+4cWPjsbOzs0XbdlF6m5Uo+fkklT0WSNJZZ53VeOy49nO2ZcuWrqfQuUceeaTx2O3bt7c4k/Ltl8z9xBNPLJ3OSBS9JQUAAAAAYLywKAQAAACAAWNRCAAAAAADxqIQAAAAAAaMRSEAAAAADBiLQgAAAAAYMBaFAAAAADBgLAoBAAAAYMBYFAIAAADAgLEoBAAAAIABY1EIAAAAAAO2sosrnZyc7OJqR2JhYaHrKViZnp4uGr9hw4ai8evWrSsaPz8/33hs6ffpzp07i8aj/Puj5P63devWwtl4uOmmm1oZK0lr164tGl/6eMh9RDr//PMbjy29fTdt2lQ0fvXq1UXjS/qVPpa7mJ2dbTz2tNNOK9r23Nxca3ORyh5vS7eN9jk/dx6VE088sfHYW265pcWZlNu+fXvjsY888kiLM9k/9hQCAAAAwICxKAQAAACAAWu8KIyIFRFxZ0R8os0JoR3080Y/b/TzRj9v9PNFO2/081Kyp3C9pHvamghaRz9v9PNGP2/080Y/X7TzRj8jjRaFEXGcpF+QdFW700Eb6OeNft7o541+3ujni3be6Oen6Z7CjZIuk/REi3NBe+jnjX7e6OeNft7o54t23uhnZtlFYUT8oqSHMvP2wzAfjBj9vNHPG/280c8b/XzRzhv9PDXZU3i6pPMiYl7SZkmvjojrWp0VRol+3ujnjX7e6OeNfr5o541+hpZdFGbmOzLzuMycknShpH/KzItanxlGgn7e6OeNft7o541+vmjnjX6eeJ9CAAAAABiwlSWDM3NW0mwrM0Hr6OeNft7o541+3ujni3be6OejaFE4KnNzc43HLiwsFG17YmKidDpFdu7c2er2x838/HzR+Onp6VbmsUfJfFavXl207dnZ2bLJGCi9DWZmZlrdfkk/7qvS1NRU0fh3vetdReM3bdpUNL5kPqX9XHqXPE5cfPHFRdsu+dkqSWeeeWbR+JL5uPQoVfIzqrRHqdLtlz4eoF/G9T5V4vbbmx+35sorryza9uWXX140/pFHHikaX2L79u2tbftAePkoAAAAAAwYi0IAAAAAGDAWhQAAAAAwYCwKAQAAAGDAWBQCAAAAwICxKAQAAACAAWNRCAAAAAADxqIQAAAAAAaMRSEAAAAADBiLQgAAAAAYsJVdXOnOnTsbj924cWPRtq+44orS6RSZnp5uPHZmZqa9iYypktv3YMZPTk42Hjs/P1+07XG0bt26ovEXX3xxSzOpbN26tfHYNWvWFG17dna2bDIGNmzYUDT+1FNPLRo/NTVVNL7k+6nkvnow47uyadOmVsZK5Y+H3/jGN4rGl9z/xlXJ93Dp42fpz5z169cXjT/ttNOKxo+jkuefCwsLRduemJgonU6Rku+n0ufOLm6//fbGY7dv31607SuvvLK1uUjSy172sta2PSrsKQQAAACAAWNRCAAAAAAD1mhRGBGTEXFDRNwbEfdExCvbnhhGh37e6OeNft7o541+3ujnjX5emv5N4fskfSozfyUijpD07BbnhNGjnzf6eaOfN/p5o583+nmjn5FlF4URMSHpDEnTkpSZuyTtandaGBX6eaOfN/p5o583+nmjnzf6+Wny8tETJH1H0jURcWdEXBURz2l5Xhgd+nmjnzf6eaOfN/p5o583+plpsihcKemlkv4iM0+T9Liky1udFUaJft7o541+3ujnjX7e6OeNfmaaLAp3SNqRmV+oP75BVWR4oJ83+nmjnzf6eaOfN/p5o5+ZZReFmfmgpG9GxMn1WT8r6e5WZ4WRoZ83+nmjnzf6eaOfN/p5o5+fpkcf/U1J19dHDtou6U3tTQktoJ83+nmjnzf6eaOfN/p5o5+RRovCzJyT9PKW54KW0M8b/bzRzxv9vNHPG/280c9L0z2FndmwYUPR+MnJyaLxq1evLho/NzdXNH7oZmZmisZPT0+3uv3Z2dmi8UO3cePGovHr1q0rGj81NdXa+FtvvbVo25deemnReAelj1c7d+5saSaVksfb0sd+lN9mpffvtr8/HJTcxqW3b+nPv9LHLJ6/lN0GF198cdG2+/QzpPS58Djet9/ylrcUjb/55puLxr/uda8rGl8yn+3btxdte1SaHGgGAAAAADCmWBQCAAAAwICxKAQAAACAAWNRCAAAAAADxqIQAAAAAAaMRSEAAAAADBiLQgAAAAAYMBaFAAAAADBgLAoBAAAAYMBYFAIAAADAgEVmHtIGFhYWDm0DOCQTExNxKJenX7fo541+3ujnjX7e6OeNft6W6seeQgAAAAAYMBaFAAAAADBgh/zyUQAAAACAL/YUAgAAAMCAtbIojIjXRsRXI2JbRFzexnX0RUTMR8SXI2IuIr7U9XxGgX7e6OeNft7o541+3ujnjX7dGvnLRyNihaT7JL1G0g5JX5T0+sy8e6RX1BMRMS/p5Zn5cNdzGQX6eaOfN/p5o583+nmjnzf6da+NPYWvkLQtM7dn5i5JmyWtbeF60A76eaOfN/p5o583+nmjnzf6dayNReGxkr656OMd9XnjKiV9JiJuj4g3dz2ZEaCfN/p5o583+nmjnzf6eaNfx1Z2PYEx8KrMfCAini/p5oi4NzM/2/Wk0Bj9vNHPG/280c8b/bzRz1vv+rWxp/ABSccv+vi4+ryxlJkP1P8+JOlGVbu/ndHPG/280c8b/bzRzxv9vNGvY20sCr8o6aSIOCEijpB0oaSPt3A9nYuI50TEkXv+L+kcSV/pdlaHjH7e6OeNft7o541+3ujnjX4dG/nLRzNzd0RcIunTklZIujoz7xr19fTEKkk3RoRU3ZYfysxPdTulQ0M/+hmhnzf6eaOfN/p5o5+3XvYb+VtSAAAAAAB8tPLm9QAAAAAADywKAQAAAGDAWBQCAAAAwICxKAQAAACAAWNRCAAAAAADxqIQAAAAAAaMRSEAAAAADBiLQgAAAAAYMBaFAAAAADBgLAoBAAAAYMBYFAIAAADAgLEoBAAAAIABY1EIAAAAAAPGohAAAAAABoxFIQAAAAAMGItCAAAAABgwFoUAAAAAMGAsCgEAAABgwFgUAgAAAMCAsSgEAAAAgAFjUQgAAAAAA8aiEAAAAAAGjEUhAAAAAAwYi0IAAAAAGDAWhQAAAAAwYGOxKIyITRFxS+FlpiNid1tzQnP080Y/b/TzRj9v9PNGP2/020tm9vIkaZOkrE//K+lhSZ+TdJmk5+w1dkLSUYXbf5akVYs+vqi6OQ5qrs+UdI2kOyXtkrSt69uv65NTv/ry6yT9m6T/lvRtSe+X9Kyub0f6NdrWz0j6qKQdkr4n6WuSNkh6Rte3I/3oN+799trusyXdVc/7VV3fjvRrtK2pRXNdfPq9rm9H+jXaFs8/jfvVlz9a0oclPVqfNkt6fhe3Xd/3FP6zqhvrhZLOknS9pEsk3RERq/YMysyFzHykZMOZ+b3M/PaI5rlC1Z3xg6piomLRLyLOUfWkdLOkUyVdKOnnJF01iu0bs+gn6XRJX5f0q5JOkfTbkn5d0sYRbd8V/by59Fvsz1W1hF+/tarmu+d05Yi378alH88/l2bRLyKeJukTkk6Q9BpJ50j6EUlbIiJGcR1Ful7RH2DlvEnSLUucf6yk/5J0zf7GqnpZ7O9L+o6qPT+bJc1I2r1ozPSejyWt0b6/Jdt0kPPeIH5TY9VP0nWSPrXXeefX2zmh69uSfgc1/7dJ+m7XtyP96DeUfpIuljQn6WSxp9Cmn57cUzjYXs799prfBvH806qfqkVgSjp50Xkvrs9bc7hvu77vKdxHZj6gasX/y/UKeykzkn5L1ROL01S9LPB3D7DZ21T9BkF68rdk66UfvHY4I2LqkCePvvZ7pqTv73Xe9+p/zzjA5Qanp/2WMinp8cLLjD36eetrv4j4MUnvUfUqi/9p8rUMUV/71T4UEQ9HxJci4m0R8fQGlxmUnvfDMnra73RJ92fmVxfN8y5Vf07xqmW+pJGzWxTW7pL0Q5Ket5/Pv13SH2fm32Tm1zLzvZI+s7+NZeYuSQv1/x+sTwv1pxckfVXV65IxGn3r9w+Szo2I8yLiaRFxvKR31p87pvFXNRx96/cU9RPUGUl/2PQyA0M/b73qFxHPlvQRSZdn5r3FX83w9Kqfqr0hl6la0J8t6a8lXSHp6uZf0qD0rR/K9K3f0ZIeXOL8B+vPHVaui8I9r7PNfT4RMaHqifzn9/rUvx7MFWXmjZn5o/VvGDAafet3taQ/kPS3ql6bf4+kLfXnnjiY6x1zfeu3+PpPUvUAvjkz//RgrnMA6Oetb/3eL+nLmckiople9cvMhzPzPZl5W2bOZeb7Vf1S5qKIOPZgrnfM9aofitHvAFwXhS9WtQL/7gHG7BMcvdGrfll5p6QjVf1R8vMk/X39aQ6asK9e9dsjIn5c0mdVtXvL4b5+I/Tz1rd+Z0u6ICJ214dp31afPxsRnz6M83DRt35Lua3+94WdzqKfHPph//rW71uSXrDE+avqzx1WdovC+jdXb5D0sczcZy9Ovdv2PyW9cq9P/fQym95Vb3/FKOaJpfW5X2Y+kZkPZOb3VR0J8TEd4GUDQ9TXfhHxk5K2qjqs81szkx/KS6Cft572O0fVUZtX16dz6/PfJBb3T9HTfkt5af3vjhFtbywY9cMSetrvXySdUL9KZs88T5F0vKq30Tis+r4oPCIiXhARx0TESyLirap24z4k6R0HuNwfSZqJiDdExEkRMaMnj/CzP/fX/54XET8cEc+VpIg4PyLuXe5lFBFxSkSsVrXiPyIiVtenIxp+rePIol9EHBURv1E3fElEvEvS5ZIuzcxHC77ecePS7wxJ/yjpJknvlrSqnvdSv30bEvp5s+iXmfdl5lf2nCTdt2ebmTnf7EsdSxb9ojoYxhsj4sUR8aKImFb1kuAbMvM/mn+5Y8eiXz2O55/7cul3i6Q7JF0XEa+IiJ9S9Xe9n1f1i9LDK3tw+NilTnrqm0/uVrWrd39vPrlJ+x5S9t2q3rByzyFlf0fSY4vGTGvRIWbr8zaq+ob5wSFl63EpaWqZ+c4vmu/i0wEvN64np36SjlL125pHVR119AuS1nV9G9Kvcb/Fc33KqevbkX70G/d+S8x9SgN/iwOnfpJ+TdKX6+t6XNJX6nk+o+vbkX48/xxIv6NVHazrMVXPQ/9OHb15fdQTGnsRcbWkUzPzZV3PBeXo541+3ujnjX7e6OeNft6G1G9l1xNoQ0Qco+rNx2+V9H+SfknVb8MuOdDl0A/080Y/b/TzRj9v9PNGP29D7zeWewojYpWq3a8/oeqNybdJ+pPM/MtOJ4ZG6OeNft7o541+3ujnjX7eht5vLBeFAAAAAIBm+n70UQAAAABAiw75bwoXFhbY1dihiYmJOJTL069b9PNGP2/080Y/b/TzRj9vS/VjTyEAAAAADBiLQgAAAAAYsEYvH42I10p6n6QVkq7KzCuXGjc5OTnCqR0c5wPnRDTbE79z587S7XbWbwg9StHv8KBf//q11aSEU79SbfemX//uU33B85d+4ecf/ZayXL9l9xRGxApJfybp5yWdIun1EXHKSGaH1tHPG/280c8b/bzRzxv9vNHPT5OXj75C0rbM3J6ZuyRtlrS23WlhhOjnjX7e6OeNft7o541+3uhnpsmi8FhJ31z08Y76PHignzf6eaOfN/p5o583+nmjnxkONAMAAAAAA9ZkUfiApOMXfXxcfR480M8b/bzRzxv9vNHPG/280c9Mk0XhFyWdFBEnRMQRki6U9PF2p4URop83+nmjnzf6eaOfN/p5o5+ZZd+SIjN3R8Qlkj6t6pCyV2fmXa3PDCNBP2/080Y/b/TzRj9v9PNGPz+N3qcwMz8p6ZMtzwUtoZ83+nmjnzf6eaOfN/p5o5+XRovCLjm/+STgrvQNVLm/to/beDhoDYwW9ylg/zj6KAAAAAAMGItCAAAAABgwFoUAAAAAMGAsCgEAAABgwFgUAgAAAMCAsSgEAAAAgAFjUQgAAAAAA8aiEAAAAAAGjEUhAAAAAAwYi0IAAAAAGLCVXU9gnEVE11MYe6W3cWa2MvZg5jKO2uxRin7AgfXp/sr9r33cxnDXp8egcXz+wp5CAAAAABgwFoUAAAAAMGAsCgEAAABgwJZdFEbE8RFxa0TcHRF3RcT6wzExjAb9vNHPG/280c8b/bzRzxv9/DQ50MxuSW/PzDsi4khJt0fEzZl5d8tzw2jQzxv9vNHPG/280c8b/bzRz8yyewoz81uZeUf9/8ck3SPp2LYnhtGgnzf6eaOfN/p5o583+nmjn5+ivymMiClJp0n6QhuTQbvo541+3ujnjX7e6OeNft7o56HxojAinivpo5JmMvPR9qaENtDPG/280c8b/bzRzxv9vNHPR6NFYUQ8XVXQ6zPzY+1OCaNGP2/080Y/b/TzRj9v9PNGPy9Njj4akv5K0j2Z+d72p4RRop83+nmjnzf6eaOfN/p5o5+fJnsKT5f0Rkmvjoi5+nRuy/PC6NDPG/280c8b/bzRzxv9vNHPzLJvSZGZn5MUo7zSzBzl5nAAbfTrkza/l6pfcnVr3PuNO/o9VekoEEAAAAZ6SURBVMn9dVzvf336+denubSB+99Tcf/D4TTu/UrvIw6Pt0VHHwUAAAAAjBcWhQAAAAAwYCwKAQAAAGDAWBQCAAAAwICxKAQAAACAAWNRCAAAAAADxqIQAAAAAAaMRSEAAAAADBiLQgAAAAAYMBaFAAAAADBgLAoBAAAAYMBWdj0BoK8ys2h8RLQ0E+BJbX6flX7Pl+I+Ancl38Nt/wxp+/4KYFjYUwgAAAAAA8aiEAAAAAAGrPGiMCJWRMSdEfGJNieEdtDPG/280c8b/bzRzxftvNHPS8mewvWS7mlrImgd/bzRzxv9vNHPG/180c4b/Yw0WhRGxHGSfkHSVe1OB22gnzf6eaOfN/p5o58v2nmjn5+mewo3SrpM0hMtzgXtoZ83+nmjnzf6eaOfL9p5o5+ZZReFEfGLkh7KzNsPw3wwYvTzRj9v9PNGP2/080U7b/Tz1GRP4emSzouIeUmbJb06Iq5rdVYYJfp5o583+nmjnzf6+aKdN/oZWnZRmJnvyMzjMnNK0oWS/ikzL2p9ZhgJ+nmjnzf6eaOfN/r5op03+nnifQoBAAAAYMBWlgzOzFlJs63MBK2jnzf6eaOfN/p5o58v2nmjn4+iRSFQKiK6nsJTZGbXU7DifHv17XuvC33r1+Z86N0v49qjb/cpAKNRet8ex8c4Xj4KAAAAAAPGohAAAAAABoxFIQAAAAAMGItCAAAAABgwFoUAAAAAMGAsCgEAAABgwFgUAgAAAMCAsSgEAAAAgAFjUQgAAAAAA8aiEAAAAAAGbGUXVxoRjcdmZoszQd/QG6NS+r1U8rgEHKw2v894/PRGP+DA+rR+GMf7K3sKAQAAAGDAWBQCAAAAwIA1WhRGxGRE3BAR90bEPRHxyrYnhtGhnzf6eaOfN/p5o583+nmjn5emf1P4PkmfysxfiYgjJD27xTlh9OjnjX7e6OeNft7o541+3uhnZNlFYURMSDpD0rQkZeYuSbvanRZGhX7e6OeNft7o541+3ujnjX5+mrx89ARJ35F0TUTcGRFXRcRzWp4XRod+3ujnjX7e6OeNft7o541+ZposCldKeqmkv8jM0yQ9LunyVmeFUaKfN/p5o583+nmjnzf6eaOfmSaLwh2SdmTmF+qPb1AVGR7o541+3ujnjX7e6OeNft7oZ2bZRWFmPijpmxFxcn3Wz0q6u9VZYWTo541+3ujnjX7e6OeNft7o56fp0Ud/U9L19ZGDtkt6U3tTQgvo541+3ujnjX7e6OeNft7oZ6TRojAz5yS9vOW5oCX080Y/b/TzRj9v9PNGP2/089J0T2FnIqJofGa2NBMcjL71KP1+wnA0/V5dWFhoeSZAP/H46Y1+ZbdB356/lCidO98b/dJVjyYHmgEAAAAAjCkWhQAAAAAwYCwKAQAAAGDAWBQCAAAAwICxKAQAAACAAWNRCAAAAAADxqIQAAAAAAaMRSEAAAAADBiLQgAAAAAYMBaFAAAAADBgkZmHtIGFhYVD2wAOycTERBzK5enXLfp5o583+nmjnzf6eaOft6X6sacQAAAAAAaMRSEAAAAADNghv3wUAAAAAOCLPYUAAAAAMGCtLAoj4rUR8dWI2BYRl7dxHX0REfMR8eWImIuIL3U9n1Ggnzf6eaOfN/p5o583+nmjX7dG/vLRiFgh6T5Jr5G0Q9IXJb0+M+8e6RX1RETMS3p5Zj7c9VxGgX7e6OeNft7o541+3ujnjX7da2NP4SskbcvM7Zm5S9JmSWtbuB60g37e6OeNft7o541+3ujnjX4da2NReKykby76eEd93rhKSZ+JiNsj4s1dT2YE6OeNft7o541+3ujnjX7e6NexlV1PYAy8KjMfiIjnS7o5Iu7NzM92PSk0Rj9v9PNGP2/080Y/b/Tz1rt+bewpfEDS8Ys+Pq4+byxl5gP1vw9JulHV7m9n9PNGP2/080Y/b/TzRj9v9OtYG4vCL0o6KSJOiIgjJF0o6eMtXE/nIuI5EXHknv9LOkfSV7qd1SGjnzf6eaOfN/p5o583+nmjX8dG/vLRzNwdEZdI+rSkFZKuzsy7Rn09PbFK0o0RIVW35Ycy81PdTunQ0I9+RujnjX7e6OeNft7o562X/Ub+lhQAAAAAAB+tvHk9AAAAAMADi0IAAAAAGDAWhQAAAAAwYCwKAQAAAGDAWBQCAAAAwICxKAQAAACAAWNRCAAAAAADxqIQAAAAAAbs/wFP1iT55YP+qwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1008x360 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random \n",
    "\n",
    "fig, axs = plt.subplots(2, 8, figsize=(14, 5))\n",
    "\n",
    "for i in range(8):\n",
    "    \n",
    "    rand = random.choice(range(y_train.shape[0]))\n",
    "\n",
    "    img_orig = x_train[rand]\n",
    "    img_comp = x_train_high_contrast[rand]\n",
    "    \n",
    "    display_img(img_orig, y_train[rand], axs[0][i], vmin=None, vmax=None)\n",
    "    display_img(img_comp, y_train[rand], axs[1][i], vmin=None, vmax=None)\n",
    "\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "scores = {}\n",
    "\n",
    "for k in range(1, 1301, 25):\n",
    "    \n",
    "    clf = KNeighborsClassifier(n_neighbors=k, metric='cosine', p=3)\n",
    "    clf.fit(x_train_high_contrast, y_train)\n",
    "    y_test_pred = clf.predict(x_test_high_contrast)\n",
    "    scores[k] = accuracy_score(y_test, y_test_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:10: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  # Remove the CWD from sys.path while we load stuff.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 1, figsize=(14, 5))\n",
    "\n",
    "pd.Series(scores).plot(\n",
    "    title='Accuracy vs k',\n",
    "    kind='bar',\n",
    "    color='k',\n",
    "    ax=ax\n",
    ")\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best_params: {'metric': 'euclidean', 'n_neighbors': 1}\n",
      "best_score: 0.9851521409885722\n"
     ]
    }
   ],
   "source": [
    "# https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "parameters = {'metric':('manhattan','euclidean', 'cosine'), 'n_neighbors': range(1, 21)}\n",
    "\n",
    "knn = KNeighborsClassifier()\n",
    "clf = GridSearchCV(knn, param_grid=parameters, scoring='accuracy', cv=5)\n",
    "\n",
    "clf.fit(x_train, y_train)\n",
    "\n",
    "print('best_params:', clf.best_params_)\n",
    "print('best_score:', clf.best_score_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9866666666666667"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test_pred = clf.predict(x_test)\n",
    "accuracy_score(y_test, y_test_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 89.3% [train score: 94.4%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.preprocessing import Binarizer\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "scaler = Binarizer()\n",
    "clf = KNeighborsClassifier(n_neighbors=3, metric='euclidean')\n",
    "\n",
    "x_train_scaled = scaler.fit_transform(x_train)\n",
    "x_test_scaled = scaler.transform(x_test)\n",
    "\n",
    "clf.fit(x_train_scaled, y_train)\n",
    "\n",
    "y_train_pred = clf.predict(x_train_scaled)\n",
    "y_test_pred = clf.predict(x_test_scaled)\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [train score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred)\n",
    "    )\n",
    "    \n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:16: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  app.launch_new_instance()\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x360 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random \n",
    "\n",
    "fig, axs = plt.subplots(2, 8, figsize=(14, 5))\n",
    "\n",
    "for i in range(8):\n",
    "    \n",
    "    rand = random.choice(range(y_train.shape[0]))\n",
    "\n",
    "    img_orig = x_train[rand]\n",
    "    img_comp = x_train_scaled[rand]\n",
    "    \n",
    "    display_img(img_orig, y_train[rand], axs[0][i], vmin=None, vmax=None)\n",
    "    display_img(img_comp, y_train[rand], axs[1][i], vmin=None, vmax=None)\n",
    "\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy import ndimage\n",
    "\n",
    "k_sharpen = [[0,-1,0], [-1,5,-1], [0,-1,0]]\n",
    "k_smooth = [[0.1,0.1,0.1],[0.1,0.2,0.1],[0.1,0.1,0.1]]\n",
    "k_wtf = [[1,-1],[-1,0]]\n",
    "k = k_wtf\n",
    "\n",
    "x_train_conv = ndimage.convolve(x_train.reshape((x_train.shape[0], 8, 8)), [k], mode='reflect', cval=0.0) \n",
    "x_test_conv = ndimage.convolve(x_test.reshape((x_test.shape[0], 8, 8)), [k], mode='reflect', cval=0.0)\n",
    "\n",
    "x_train_conv = x_train_conv.reshape(x_train_conv.shape[0], x_train_conv.shape[1]*x_train_conv.shape[2]) \n",
    "x_test_conv = x_test_conv.reshape(x_test_conv.shape[0], x_test_conv.shape[1]*x_test_conv.shape[2]) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:16: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  app.launch_new_instance()\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x360 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random \n",
    "\n",
    "fig, axs = plt.subplots(2, 8, figsize=(14, 5))\n",
    "\n",
    "for i in range(8):\n",
    "    \n",
    "    rand = random.choice(range(y_train.shape[0]))\n",
    "\n",
    "    img_orig = x_train[rand]\n",
    "    img_conv = x_train_conv[rand]\n",
    "    \n",
    "    display_img(img_orig, y_train[rand], axs[0][i], vmin=None, vmax=None)\n",
    "    display_img(img_conv, y_train[rand], axs[1][i], vmin=None, vmax=None)\n",
    "\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 98.9% [train score: 99.0%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=3, metric='euclidean')\n",
    "\n",
    "clf.fit(x_train_conv, y_train)\n",
    "y_train_pred = clf.predict(x_train_conv)\n",
    "y_test_pred = clf.predict(x_test_conv)\n",
    "\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [train score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred)\n",
    "    )\n",
    "    \n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 99.1% [train score: 99.3%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=3, metric='euclidean')\n",
    "\n",
    "clf.fit(x_train, y_train)\n",
    "y_train_pred = clf.predict(x_train)\n",
    "y_test_pred = clf.predict(x_test)\n",
    "\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [train score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred)\n",
    "    )\n",
    "    \n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Inverted Image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 99.1% [train score: 99.3%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=3, metric='euclidean')\n",
    "\n",
    "clf.fit(x_train, y_train)\n",
    "y_train_pred = clf.predict(x_train)\n",
    "y_test_pred = clf.predict(x_test)\n",
    "\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [train score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred)\n",
    "    )\n",
    "    \n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train_inv = x_train.max() - x_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_test_inv = x_test.max() - x_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[16., 16., 15., ...,  6., 16., 16.],\n",
       "       [16., 13.,  2., ..., 16., 16., 16.],\n",
       "       [16., 16., 13., ..., 16., 16., 16.],\n",
       "       ...,\n",
       "       [16., 16., 16., ..., 16., 16., 16.],\n",
       "       [16., 16.,  7., ...,  4.,  5., 16.],\n",
       "       [16., 14.,  3., ...,  0.,  0., 13.]])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train_inv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:38: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x360 with 8 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 8, figsize=(14, 5))\n",
    "\n",
    "\n",
    "img_orig = x_train[rand]\n",
    "img_inv = x_train_inv[rand]\n",
    "\n",
    "display_img(img_inv, y_train[0], axs[0], vmin=None, vmax=None)\n",
    "    \n",
    "n_neighbors = 7\n",
    "\n",
    "_, kneighbors_index_inv = clf.kneighbors(\n",
    "    [x_train_inv[0]], \n",
    "    n_neighbors=n_neighbors, \n",
    "    return_distance=True\n",
    ")\n",
    "\n",
    "\n",
    "for i, neighbor_index in enumerate(kneighbors_index_inv[0], 1):\n",
    "    \n",
    "    display_img(\n",
    "        x_train[neighbor_index], \n",
    "        y_train[neighbor_index], \n",
    "        axs[i]\n",
    "    )\n",
    "    \n",
    "# Styling\n",
    "\n",
    "\n",
    "for i in range(n_neighbors+1):\n",
    "    \n",
    "    for spline in axs[i].spines.values():\n",
    "        linestyle = '-' if i == 0 else '--'\n",
    "        linewidth = 3 if i == 0 else 1\n",
    "        \n",
    "        spline.set_linestyle(linestyle)\n",
    "        spline.set_linewidth(linewidth)\n",
    "        spline.set_color('k')\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:70: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4UAAAEeCAYAAAA97rAJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3db3Bcd33v8c8Xu07SGLQMkMT5M5YfxClJqJTUA/XAYCW5YKABObRkksufqA+AyVxaKckMfzrTWnkA7X1QLN9Oh0LTWLTQpvcCkYDL5d9tlJbbQmliZdok0KawHhL+t6ygvfS6Lt/7YNcgedfW+Up7fPa75/2aOWPr6OezP+1796x+WnnX3F0AAAAAgHp6WtUTAAAAAABUh0UhAAAAANQYi0IAAAAAqDEWhQAAAABQYywKAQAAAKDGWBQCAAAAQI0NxaLQzObN7LPBfzNlZifKmhOKo19u9MuNfrnRLzf65Ua/3Oh3CncfyE3SvCTvbP8u6buSPifprZLOP2XsiKRnBo9/nqQLV338uvbVsaG5nivpiKSjko5LeqLq66/qjX65N/rl3uiXe6Nf7o1+uTf65d7ot/Ft0J8p/AtJOyTtlHSdpA9Keoukh83swpOD3H3F3b8XObC7/9Ddv9WneW5RO+b7JN3Xp2MOA/rlRr/c6Jcb/XKjX270y41+G1H1iv4Mq+d5SZ/tsf8SSf8s6cjpxqr9a7HvkvQdSf+i9hU9I+nEqjFTJz+WNKGf/FTh5Da/wXnPip/U0C/5Rr/cG/1yb/TLvdEv90a/3Bv9Nr4N+jOFXdz9KbVX/K82s9PNf0bSr0q6U9I1kv5a0m+c4bB/qfZPEKT2TxZ2SJqWfvy7w25mo5uePOiXHP1yo19u9MuNfrnRLzf6rS/dorDjUUnPkPTs03z+LkmH3P2P3P0f3P3dkj59uoO5+3FJK52/f7OzrXQ+vSLpy2r/XjL6g3650S83+uVGv9zolxv9cqPfGWRdFFrnT+/6hNmIpIslff6UT/3VRi7I3e9395/p/IQB/UG/3OiXG/1yo19u9MuNfrnR7wyyLgqvUnsF/k9nGNMVHAODfrnRLzf65Ua/3OiXG/1yo98ZpFsUmtklkl4r6SPu/qNTP9952vbrkvae8qmfX+fQxzvH39KPeaI3+uVGv9zolxv9cqNfbvTLjX7rG/RF4TYzu8jMLjaz55nZ7Wo/jfttSe84w7/7bUkzZvZaM7vczGYkvVRnXv1/tfPnq8zsOWa2XZLM7CYz+1LnxnRaZnalmY1Luqgz7/HOtq3g1zqM6Jcb/XKjX270y41+udEvN/ptRNkvb7rRTWvffPKE2k/1nu7NJ+fV/ZKyv6n2G1aefEnZX5P0g1VjprTqJWY7++bUvsH8+CVlO+Nc0ug6822umu/q7Yz/blg3+uXe6Jd7o1/ujX65N/rl3uiXe6PfxjfrTGjomdm9ksbc/eeqngvi6Jcb/XKjX270y41+udEvtzr121r1BMpgZhdLuknSA5L+Q9IrJb1BP3kvEQww+uVGv9zolxv9cqNfbvTLre79hvKZQjO7UNKfSvpZSedKekLS77j771c6MRRCv9zolxv9cqNfbvTLjX651b3fUC4KAQAAAADFDPqrjwIAAAAASrTp/1NoZjzVWCF3t6rnAAAAACCxPrz0a6+XUWU7S1ufXr639HmamZ9zzjld+88777yufbfddps/61nPWrNv9+7dfuONN/Yce+q+qamprn1jY2M+NjbWtf/SSy8ttG9Q252tfueff76/4AUv6Np/ww03bKrfa17zmq59N998c9e+q666yq+66qqz0mUY+23bts137tzZtX/37t1d+w4ePOg7duxYs+/aa6/1N77xjV1jDx061LVvbm6ua9/+/ft9//79hS6/176694ts+/bt8+3bt6/Zt2PHDr/22mu7xt55551d++66666ufXv37vW9e/d27e91X+11n96+fbtv27Ztzb4tW7b4yMhILfqdd955PR9/el2nk5OT3mg01uzbuXOn79u3r2tsr3Nqr327d+/ueb/i8a///SKPf7fffnuhfXv27PE9e/aclS7D2O+cc87xK664omt/r6bT09N+wQUXrNl39dVX+6233to1drPnz16X32vf2ey36f9TyDOF1fI+PFNYZsNGoxEav7CwEBrfbDZD4+fm5gqPXV5eDh07qh/tpHL7zczMhMYfOHAgND56HUfnU6YM/SYmJkLjH3jggdD4lZWV0PjI7WNpaSl07KgM/aJmZ2dD46O3j8j9NXKuleLn8gz9pqamQuOjPaLXWeTxlce/eL/o+FarFRoffXwtU4Z+k5OTofGHDx8OjY/e/w4dOlR47OLiYujYUafrV+jXR83sZZIOS9oi6R53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\n",
      "text/plain": [
       "<Figure size 1008x360 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random \n",
    "\n",
    "fig, axs = plt.subplots(2, 8, figsize=(14, 5))\n",
    "\n",
    "rand = 0 # random.choice(range(y_train.shape[0]))\n",
    "\n",
    "img_orig = x_train[rand]\n",
    "img_inv = x_train_inv[rand]\n",
    "\n",
    "display_img(img_orig, y_train[rand], axs[0][0], vmin=None, vmax=None)\n",
    "display_img(img_inv, y_train[rand], axs[1][0], vmin=None, vmax=None)\n",
    "\n",
    "n_neighbors = 7\n",
    "\n",
    "_, kneighbors_index_orig = clf.kneighbors(\n",
    "    [x_train[rand]], \n",
    "    n_neighbors=n_neighbors, \n",
    "    return_distance=True\n",
    ")\n",
    "\n",
    "\n",
    "for i, neighbor_index in enumerate(kneighbors_index_orig[0], 1):\n",
    "\n",
    "    display_img(\n",
    "        x_train[neighbor_index], \n",
    "        y_train[neighbor_index], \n",
    "        axs[0][i]\n",
    "    )\n",
    "    \n",
    "    \n",
    "_, kneighbors_index_inv = clf.kneighbors(\n",
    "    [x_train_inv[rand]], \n",
    "    n_neighbors=n_neighbors, \n",
    "    return_distance=True\n",
    ")\n",
    "\n",
    "\n",
    "for i, neighbor_index in enumerate(kneighbors_index_inv[0], 1):\n",
    "    \n",
    "    display_img(\n",
    "        x_train[neighbor_index], \n",
    "        y_train[neighbor_index], \n",
    "        axs[1][i]\n",
    "    )\n",
    "    \n",
    "# Styling\n",
    "\n",
    "\n",
    "for i in range(n_neighbors+1):\n",
    "    \n",
    "    for spline in axs[0][i].spines.values():\n",
    "        linestyle = '-' if i == 0 else '--'\n",
    "        linewidth = 3 if i == 0 else 1\n",
    "        \n",
    "        spline.set_linestyle(linestyle)\n",
    "        spline.set_linewidth(linewidth)\n",
    "        spline.set_color('k')\n",
    "        \n",
    "    for spline in axs[1][i].spines.values():\n",
    "        linestyle = '-' if i == 0 else '--'\n",
    "        linewidth = 3 if i == 0 else 1\n",
    "        \n",
    "        spline.set_linestyle(linestyle)\n",
    "        spline.set_linewidth(linewidth)\n",
    "        spline.set_color('k')\n",
    "    \n",
    "    \n",
    "\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Custom Distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "28.930952282978865"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics.pairwise import euclidean_distances\n",
    "\n",
    "def contrast_distance(x1, x2):\n",
    "    _x1, _x2 = np.abs(8 - x1), np.abs(8 - x2)\n",
    "    d = euclidean_distances([_x1], [_x2])\n",
    "    return d[0][0]\n",
    "\n",
    "contrast_distance(x_train[0], x_train[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 89.6% [invertd test score: 89.6%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=3, metric=contrast_distance)\n",
    "\n",
    "clf.fit(x_train, y_train)\n",
    "\n",
    "y_test_pred = clf.predict(x_test)\n",
    "y_test_inv_pred = clf.predict(x_test_inv)\n",
    "\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [invertd test score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_test, y_test_inv_pred)\n",
    "    )\n",
    "    \n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:70: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x360 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random \n",
    "\n",
    "fig, axs = plt.subplots(2, 8, figsize=(14, 5))\n",
    "\n",
    "rand = 0 # random.choice(range(y_train.shape[0]))\n",
    "\n",
    "img_orig = x_train[rand]\n",
    "img_inv = x_train_inv[rand]\n",
    "\n",
    "display_img(img_orig, y_train[rand], axs[0][0], vmin=None, vmax=None)\n",
    "display_img(img_inv, y_train[rand], axs[1][0], vmin=None, vmax=None)\n",
    "\n",
    "n_neighbors = 7\n",
    "\n",
    "_, kneighbors_index_orig = clf.kneighbors(\n",
    "    [x_train[rand]], \n",
    "    n_neighbors=n_neighbors, \n",
    "    return_distance=True\n",
    ")\n",
    "\n",
    "\n",
    "for i, neighbor_index in enumerate(kneighbors_index_orig[0], 1):\n",
    "\n",
    "    display_img(\n",
    "        x_train[neighbor_index], \n",
    "        y_train[neighbor_index], \n",
    "        axs[0][i]\n",
    "    )\n",
    "    \n",
    "    \n",
    "_, kneighbors_index_inv = clf.kneighbors(\n",
    "    [x_train_inv[rand]], \n",
    "    n_neighbors=n_neighbors, \n",
    "    return_distance=True\n",
    ")\n",
    "\n",
    "\n",
    "for i, neighbor_index in enumerate(kneighbors_index_inv[0], 1):\n",
    "    \n",
    "    display_img(\n",
    "        x_train[neighbor_index], \n",
    "        y_train[neighbor_index], \n",
    "        axs[1][i]\n",
    "    )\n",
    "    \n",
    "# Styling\n",
    "\n",
    "\n",
    "for i in range(n_neighbors+1):\n",
    "    \n",
    "    for spline in axs[0][i].spines.values():\n",
    "        linestyle = '-' if i == 0 else '--'\n",
    "        linewidth = 3 if i == 0 else 1\n",
    "        \n",
    "        spline.set_linestyle(linestyle)\n",
    "        spline.set_linewidth(linewidth)\n",
    "        spline.set_color('k')\n",
    "        \n",
    "    for spline in axs[1][i].spines.values():\n",
    "        linestyle = '-' if i == 0 else '--'\n",
    "        linewidth = 3 if i == 0 else 1\n",
    "        \n",
    "        spline.set_linestyle(linestyle)\n",
    "        spline.set_linewidth(linewidth)\n",
    "        spline.set_color('k')\n",
    "    \n",
    "    \n",
    "\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# KNN Regressor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x, y = digits['data'], digits['target']\n",
    "\n",
    "x_train, x_test, y_train, y_test = train_test_split(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MNIST: Accuracy score = 99.3% & MAE = 0.2\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=3, metric='euclidean')\n",
    "\n",
    "clf.fit(x_train, y_train)\n",
    "y_test_pred = clf.predict(x_test)\n",
    "\n",
    "print(\n",
    "    'MNIST: Accuracy score = {:.1%} & MAE = {:.2}'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        mean_squared_error(y_test, y_test_pred)\n",
    "    )\n",
    "    \n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MNIST: Accuracy score = 97.8% & MAE = 0.13\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.neighbors import KNeighborsRegressor\n",
    "\n",
    "reg = KNeighborsRegressor(n_neighbors=3, metric='euclidean')\n",
    "\n",
    "reg.fit(x_train, y_train)\n",
    "y_test_pred = reg.predict(x_test)\n",
    "y_test_pred_int = y_test_pred.round(0).astype(int)\n",
    "\n",
    "print(\n",
    "    'MNIST: Accuracy score = {:.1%} & MAE = {:.2}'.format(\n",
    "        accuracy_score(y_test, y_test_pred_int),\n",
    "        mean_squared_error(y_test, y_test_pred)\n",
    "    )\n",
    "    \n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_mnist_rgrsr_pred = pd.DataFrame(\n",
    "    {\n",
    "        'y_test': y_test,\n",
    "        'y_test_pred': y_test_pred,\n",
    "    }\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>y_test</th>\n",
       "      <th>y_test_pred</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>176</th>\n",
       "      <td>8</td>\n",
       "      <td>7.333333</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     y_test  y_test_pred\n",
       "176       8     7.333333"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_mnist_rgrsr_pred[\n",
    "    (\n",
    "        np.abs(df_mnist_rgrsr_pred['y_test'] - df_mnist_rgrsr_pred['y_test_pred']) > 0\n",
    "    ) & (\n",
    "        np.abs(df_mnist_rgrsr_pred['y_test'] - df_mnist_rgrsr_pred['y_test_pred']) < 1\n",
    "    )\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "8 7.333333333333333\n",
      "[8 8 6] 7.333333333333333\n"
     ]
    }
   ],
   "source": [
    "df_mnist_rgrsr_pred_mistakes_idx = df_mnist_rgrsr_pred[\n",
    "    (\n",
    "        np.abs(df_mnist_rgrsr_pred['y_test'] - df_mnist_rgrsr_pred['y_test_pred']) > 0\n",
    "    ) & (\n",
    "        np.abs(df_mnist_rgrsr_pred['y_test'] - df_mnist_rgrsr_pred['y_test_pred']) < 1\n",
    "    )\n",
    "].index.tolist()\n",
    "\n",
    "for i in df_mnist_rgrsr_pred_mistakes_idx:\n",
    "    neighbors = reg.kneighbors(\n",
    "        [x_test[i]], \n",
    "        n_neighbors=3, \n",
    "        return_distance=False\n",
    "    )[0].tolist()\n",
    "    \n",
    "    print(y_test[i], y_test_pred[i])\n",
    "    print(y_train[neighbors], np.mean(y_train[neighbors]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:18: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "fig, ax = plt.subplots(1, 1, figsize=(16, 8))\n",
    "\n",
    "cm = confusion_matrix(y_test, y_test_pred_int)\n",
    "sns.heatmap(\n",
    "    cm, cmap='Greys', \n",
    "    annot=True, \n",
    "    fmt=\"d\",\n",
    "    ax=ax\n",
    ") \n",
    "\n",
    "ax.set_title('MNIST')\n",
    "ax.set_xlabel('Predicted Label')\n",
    "ax.set_ylabel('True Label')\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Digits PCA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "scaler = StandardScaler()\n",
    "pca = PCA(n_components=2)\n",
    "\n",
    "x_train_scaled = scaler.fit_transform(x_train)\n",
    "x_test_scaled = scaler.transform(x_test)\n",
    "\n",
    "x_train_2d = pca.fit_transform(x_train_scaled)\n",
    "x_test_2d = pca.transform(x_test_scaled)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:22: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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27cP48aNw4QJE1SHo3lMSImIiIhc7ODBgzh16hRmzpypOhSvwISUiIiIyMV27NiBgQMHYt68eapD8QpMSImIiIhcyGg0oqSkBHFxcYiIiFAdjldgQkpERETkQrm5uTAYDJg7d67qULwGE1IiIiIiF6qsrMS0adMQHx+vOhSvwbFPRERERC60aNEi1SF4HVZIiYiIiEgpJqREREREpBQTUiIiIiJSigkpERERESnFhJSIiIiIlGJCSkRERERKMSElIiIiIqWYkBIRERGRUkxIiYiIiEgpJqREREREpBQTUiIiIiJSigkpERERESnFhJSIiIiIlGJCSkRERERKMSElIiIiIqWYkBIRERGRUppJSIUQi4QQh4UQ/xRC/LcQIlR1TERERETkfppISIUQVwJ4GsBNUsrrAQQCeFBtVERERETkCZpISC8LAqATQgQB0AP4XnE8REREROQBQkqpOgYAgBAiDcAqAI0A/iKlTLbcV1dXZw2ytLRUQXRERERE5Kjx48dbb0dFRYmu9wd5NJpeCCEGAbgPwFgAtQC2CyF+KaV8r+tjO34gb1RaWur1n0EFXjfH8LrZj9fMMbxujuF1cwyvm2O0fN00kZACuAPACSnleQAQQnwE4BYA3RJSIiIiX5KRkYELFy50+t6oUaOQnp6uKCIiz9PKHtLTAG4WQuiFEALAzwAUK46JiIjI7cLDw6HX66HX6yGEQHFxMYxGo+qwiDxKExVSKeU+IcQOAAcAtAA4COD3aqMiIiJyvyVLllhvv/HGGzh8+DDmz5+vMCIiz9NEQgoAUspMAJmq4yAiIlJBSol9+/Zh3LhxmDBhgupwiDxKK0v2REREfu3gwYM4deoUZs6cqToUIo9jQkpERKQBO3bswMCBAzFv3jzVoRB5HBNSIiIixYxGI0pKShAXF4eIiAjV4RB5HBNSIiIixXJzc2EwGDB37lzVoRApwYSUiIhIscrKSkybNg3x8fGqQyFSQjNd9kRERP5q0aJFqkMgUooVUiIiIiJSigkpERERESnFhJSIiIiIlGJCSkRERERKMSElIiIiIqWYkBIRERGRUkxIiYiIiEgpJqREREREpBQTUiIiIiJSigkpERERESnFhJSIiIiIlGJCSkRERERKMSElIiIiIqWYkBIRERGRUkxIiYiIiEgpJqREREREpBQTUiIiIiJSigkpERERESnFhJSIiIiIlGJCSkRERERKMSElIiIiIqWYkBIRERGRUkxIiYiIiEgpJqREREREpBQTUiIiIiJSigkpERERESnFhJSIiIiIlGJCSkRERERKMSElIiIiIqWYkBIRERGRUkxIiYiIiEgpJqREREREpBQTUiIiIiJSigkpERERESnFhJSIiIiIlGJCSkRERF7n1KlTSE1NRXZ2tupQyAWCVAdAREREZI+2tjZkZWWhrKwMbW1tqsMhF2CFlIiIiLzKxx9/jJMnTyI2NlZ1KOQiTEiJiIjIa5w9exaffPIJkpKSEB4erjocchEmpEREROQVpJRYuXIlhg0bhpSUFNXhkAsxISUiIiKvkJeXh6KiIuj1eqxevRrV1dWorq7Gm2++qTo0chKbmoiIiMgrCCEwbtw4GI1GlJaWorm5GQBw6NAhxZGRs5iQEhERkVdISEhAQkICSktLMX78eDz55JOQUmLjxo2qQyMnMSElIiIirzR69GjVIZCLMCElIiIir7R06VLVIZCLsKmJiIiIiJRiQkpERERESjEhJSIiIiKluIeUiMiPZGRk4MKFC52+N2rUKKSnpyuKiIiIFVIiIr8SHh4OvV4PvV4PIQSKi4thNBpVh0VEfo4VUiIiP7JkyRLr7TfeeAOHDx/G/PnzFUZERMQKKRGRX5JSYt++fRg3bhwmTJigOhwi8nOaqZAKIQYCeAvA9QAkgP+QUn6lNioiIt908OBBnDp1CikpKdbvcX8pEamimYQUwH8B+F8pZaIQIgSAXnVARES+aseOHRg4cCDmzZtn/V54eDiampoAAI2NjThy5AiGDBmiKkQi8iOaSEiFEFEAbgOQAgBSSjMAs8qYiIh8ldFoRElJCeLi4hAREWH9PveXEpEqQkqpOgYIISYD+D2AIwAmAfgGQJqUsgEA6urqrEGWlpYqiZGIyFd8+umn2Lp1K379619j8uTJ3e6XUuL5559HUFAQVq5cqSBCIvI148ePt96OiooSXe/XRIUU7XHcAOBXUsp9Qoj/ArAUQEbXB3b8QN6otLTU6z+DCrxujuF1s5+/XLNbb70V8+bNQ0BA997WAwcOwGAwICUlxeZr4S/XzdV43RzD6+YYLV83rSSkZwCckVLuu/z1DrQnpERE5GKLFi3q8/6e9pcSEbmTJsY+SSkrAJQLISyzR36G9uV7IiLyoN72lxIRuZMmEtLLfgXgfSHEtwAmA/hPxfEQEfmd3NxcGAwGzJ07V3UoRORHtLJkDynlIQA3qY6DiMifVVZWYtq0aYiPj1cdChH5Ec0kpEREpF5/+0uJiNxBS0v2REREROSHmJASERERkVJMSImIiIhIKSakRERERKQUE1IiIiIiUopd9kTktfLz87Fr1y40NDRAp9Nhzpw5mD59uuqwiIjITqyQEpHXysvLQ21tLfR6PSoqKpCRkYFDhw6pDouIiOzECikRea2srCzr7ZqaGiQnJyM/Px+TJ09WGBUREdmLCSkRebUDBw6goKAAJSUlMJlMmDVrluqQiIjITkxIicir7d27F/n5+Th//jx0Oh2GDRumOiQiIrIT95ASkVdLTU3Ftm3b8M477yAwMBAbN25UHRIREdmJCSkReS2TyWS9HRMTA51OB7PZrDAiIiJyBJfsichrpaSkYOjQodDpdKioqIDBYMCiRYtUh0VERHZihZSIvFZiYiJ0Oh2ampowcuRIrFmzhnNIiYi8ECukROS1EhMTkZiYqDoMslFGRgYuXLjQ6XujRo1Cenq6ooiISCtYISUiIo8IDw+HXq+HXq+HEALFxcUwGo2qwyIiDWCFlIiIPGLJkiXW22+88QYOHz6M+fPnd3scK6m8BuR/mJASEZFHSSmxb98+jBs3DhMmTOh2f3h4OJqamgAAjY2NOHLkCIYMGeLpMB3W0tKCt99+G0eOHEFYWBgee+wxjBo1yq7X8PZrQGQvJqRE5HGs/vi3gwcP4tSpU0hJSenxflsrqVq1atUqfPnll5g8eTJOnDiBhQsX4r333kNUVJTNr+Ht14DIXtxDSkQex72E/qmlpQWbNm3CU089herqakybNq3Px/dXSdWi1tZWfPvtt5g6dSpeeuklvPrqq2hsbMQHH3zg0Ot54zUgcgQTUiLyuCVLluCll17CSy+9hIkTJ0JKyeqPH1i1ahW2bt2Kuro6BAYGYsmSJairq+v18ZZK6syZMz0YpXNaW1vR2toKvV4PoP2Pr7CwMJw8edKh1/PGa0DkCCakRKQMqz/+w1I5jIqKwpAhQ7B69ep+K4c7duzAwIEDMW/ePA9G6pyQkBAMGzYM33zzDbZs2YLly5fDYDA4vALgjdeAyBFMSIlIGVZ//Ielctjc3Ixp06bhtttu67NyaDQaUVJSgri4OERERHg2WCctX74csbGx2Lp1K6qqqhAaGgqdTmf363jzNSCyFxNSIlKG1R//YakcBgUF4cc//jFWrFjRZ+UwNzcXBoMBc+fO9XCkzhsxYgTWrVuHTz/9FAsXLkRzczNuvvlmu1/Hm68Bkb3YZU9ESrD6o03unICwfPlyZGdnY+vWrYiOju6zclhZWYlp06YhPj7e6ff1tMzMTNTU1CAkJASHDx/GVVddhbvuusvu1/Hma0BkLyakRKSEpfrz3HPPqQ6FOnDn/EtL5RAA9u3bh/T09F4rh4sWLXLJe6qQkJCAjz/+GGazGXPmzMFDDz2E4OBgu1/Hm68Bkb2YkBKREqz+aJM751+6qnKodTNnzuS+aCI7MSElIiVY/dE2d0xAcFXlkIh8DxNSIiLqpr/TlBzhTZVDVxz/SUS2Y5c9ERF14+8TEFatWoXt27cjODjYevxnX0P8icg5TEiJiKgTf5+A4OrjP4mof0xIiYioE3+ff+nq4z+JqH/cQ0pE5If6mjfq7xMQuh7/WVRU5NTxn0TUPyakRER+qK95o45OQHDnUH1Ps2eIPxE5jwkpEZEfcse8UXcO1fc0e4b4E5HzmJASEfkxV84bdedQfU/zlyH+RFrBpiYiIj9mmTfqyvmg7hiq72kJCQkIDQ1FS0sL5syZgw0bNnCIP5EbsUJKROTH3DFv1B1D9T3Nm4b4E/kCVkiJiPyUu+aN+vtQfSKyHyukREQu5i3d5pZ5o88995zLXtPfh+oTkWNYISUicrHw8HDo9Xro9XoIIVBcXKzJGZbumDfq70P1icgxrJASEbmYt3SbOzpvtC/+PlSfiBzDhJTIS+Xn52PXrl1oaGiATqfDnDlzMH36dI/H4S3L0yr4Qre5vdyR5BKR7+OSPZGXysvLQ21tLfR6PSoqKpCRkYFDhw55PA5vWZ5WwR0jlYiIfBErpEReKisry3q7pqYGycnJyM/Px+TJkz0ah7csT6vAbnMiItswISXyYgcOHEBBQQFKSkpgMpkwa9YsZbH42/J0f1sV2G1O3oRbb0g1LtkTebG9e/ciPz8fhw8fhk6nw7Bhw5TF4m/L0/1tVWC3OXkTbr0h1VghJfJiqampSE1NxenTp7Fw4UJs3LgRmZmZSmLRwvK0Jxu9+tuqwG5z8ibcekOqsUJK5KVMJpP1dkxMDHQ6Hcxms5JYtLI8raLRq7etCosWLcLLL7+MgAD+miXv4W9bb0g7WCEl8lIpKSkYOnQodDodKioqYDAYlI3ccceJP45Q0ejlC+e2E1nw59n3nTp1Cjk5ORg1ahSWLl2qOhwrJqREXioxMRH79+9HU1MTRo4cicWLF3u8w95CS8vTnm700sJWBSJX4c+zb2tra0NWVhbKysrQ1tamOpxOmJASeanExEQkJia65LWc3XuppWHolkav8+fPu73RSytbFYhcgT/Pvu/jjz/GyZMnERsbqzqUbri5iYg0M2TfFVJTU7Ft2za88847CAwMxMaNG932XuykJ1/Cn2ffdvbsWXzyySdISkpCeHi46nC6YYWUiDQzZN9ZJpMJoaGhADzT6KWlrQpEzuLPs++SUmLlypUYNmwYUlJS8PXXX6sOqRsmpEQEQFtD9h3l6UYvLW1VIHIWf559V15eHoqKinD11Vdj9erVqK6uhpQSb775Jp588knV4QHgkj0RXaalIfuOSkxMhE6nszZ6rVmzxm1zSImIvIUQAuPGjYPRaERpaSmam5vR0tKiqa1ZQkqpOgYrIUQggEIAZ6WUd1u+X1dXp50gnVRaWorx48erDsPr9HXdPDkM3ds48vNmGbJ/0003KRuyrxL/jTqG180xvG6O4XVzjOW6Pfnkk5BSunWPfV+ioqJE1+9pbck+DUAxgEjVgZD3sDTkREVF4dy5c8jIyMArr7zidfsfVfL03ktyv6NHj+Kjjz5CVVUVhBBYu3at6pCISCNGjx6tOoRuNJOQCiFiAdwFYBWAxYrDIS/iKw05KmlpyL6tMjIycOHChU7fGzVqFNLT0xVFpC25ubkoLCxEW1sbgoI086ve7VpaWvD222/jyJEjCAsLw2OPPYZRo0apDotIU7Q0EN9CS3tIXwOQDkBbk1rJKxw4cAAbNmzA8uXLvbYhRyVv3HsZHh4OvV4PvV4PIQSKi4thNBpVh6UZaWlp2LZtG66//nrVoXjUqlWrsH37dgQHB+PEiRNYuHAh6urqVIdFRP3QxJ/NQoi7AVRJKb8RQvykr8eWlpZ6Jig38oXPoEJf1+1//ud/sH//fly4cAEDBgywbtwm237eJk2ahEmTJtn9PJV+8YtfWG//4Q9/gMlkwi233OKSuLX+2e1x4cIFNDQ0eOQzqb5ura2t2Lt3L8aPH49HH30UBoMBzz77LNavX48HHnhAaWx9UX3dvBWvm2NUXbf+9vxqIiEFMAPAvUKIOwGEAogUQrwnpfxl1wd6+yZmbsR2TH/XzdJ8Y2nI+ctf/uKXDTld+cPPm5QSx48fx8SJE/Hzn//c6dfztWs2aNAghIWFuf0zaeG6mc1mDBgwACNGjMD48eNx5ZVXYvDgwWhoaFAeW2+0cN28Ea+bY7R83TSRkEopnwfwPABcrpA+21MyStQTNuT4t4MHD+LUqVNISUlRHQopFhISgmHDhuGbb77Bli1bUFRUBIPBwK0cRF5AEwkpkTO8sSGHXGfHjh0YOHAg5s2bpzoU0oDly5cjOzsbW7duRXR0NEJDQ6HT6VSHRUT90FxCKqX8HMDnisMgL5KYmIj9+/dbG3IWL17MDnsfYEsXvdFoRElJCeLi4hAREeHpEDWtqKgIW7ZsQXl5OUwmE9LT0xEXF4dHHnlEdWhuNWLECKxbtw4AsG/fPqSnp+Pmm29WHBUR9UdzCSmRvRITE5GYmKg6DHKx8PBwNDU1AQAaGxtx5MgRDBkypNNjcnNzYTAY8Nxzz6kIUdNMJhPq6+sxdOhQAO3Je319veKo3C8zMxM1NTUICQnB4cOHcdVVV+Guu+5SHRYR9YMJKRFp0pIlS6y333jjDRw+fBjz58/v9JjKykpMmzYN8fHx3Z7v73NK4+Pje7wuvi4hIQEff/wxzGYz5syZg4ceegjBwcFuf1/OPyVyDhNSItI0KSX27duHcePGYcKECZ3u62uvsC0VVvI9M2fOxMyZMz3+vqtWrcKXX36JyZMnW+efvvfee4iKivJ4LETeiAkpkYbk5+dj165daGhogE6nw5w5czQ/oN7dHO2it6XC6gtYmVOvtbUV3377LaZOnYpVq1ahqqoKSUlJ+OCDD/D444+rDo/IKzAhJdKQvLw81NbWIioqCufOnUNGRgZeeeUVv27SWrx4MSoqKvDVV1+hsLAQgH1L731VWH2Bv1fmtLA1o7W1Fa2trdDr9QDaq/NhYWE4efKkx2Ig8nZMSIk0JCsry3q7pqYGycnJyM/P99uE1Gg0oq6uDoMHD0ZUVJRDS+++PKeUlTltbM3g/FMi5zEhJdKYAwcOoKCgACUlJTCZTJg1a5bqkJTJzc1FZGQksrOzMX36dIeW3n15Tikrc9rZmsH5p0TOYUJKpDF79+5Ffn4+zp8/D51Oh2HDhqkOSZmOXfSOLL37+pxSVuZ+oHprBuefEjmHCSmRxqSmpiI1NRWnT5/GwoULsXHjRmRmZqoOS4mOXfQHDhywe+ndH+aUsjLXTvXWDM4/JXJOgOoAiOgHJpPJejsmJgY6nQ5ms1lhRNrhyNJ7X3NKfYWlMvfpp59i4cKFaG5u9svKnOqtGQkJCQgNDUVLSwvmzJmDDRs2eGT+KZGvYIWUSENSUlIwdOhQ6HQ6VFRUwGAw9Dlr0190XXq3tbPaH64dK3Pa2Jqhav4pka9ghZRIQxITE6HT6dDU1ISRI0dizZo1fj+HFPhh6X3u3LkA2pt39Ho99Ho9hBAoLi72y32TACtzQPefDyLyPqyQEmlIYmIiEhMTVYehOV2X3rXSWa0Frq7MaWGup738YWsGka9jQkrkJ7Zt24b8/Hzr121tbcjJyfGK7vPelt5Vd1b7Ii3M9bSXP2zNIPJ1TEiJ/MSxY8dQXl6OiRMnWr8XEODdu3ZUd1b7IlafiUgFJqTkdbxxSVErdDodli1bhvDwcAghVIfjNNWd1b6M1Wci8iQmpOR1vHFJUSuqqqpw7733Ijo6GrfeeivS0tK8NjE1Go349NNPodPp8Pzzz1u/zz9OXIPVZyLyJCak5HW4pOiYSZMmISYmBrGxsfjss8/wySefIDY21mubqHJzc9HU1ITJkydDr9d77R8nWq34s/pMRJ7EhJS8FpcU7XPPPfdYb8+ePRtJSUkoLCz02oS0srIS9957L3JychAQEOC1f5xoseKvhbmeRORfmJCSx7i6y5tLivYxGo3Q6/UAgNraWphMJoSEhCiOynEdO6u9+Y8TLVb8/eHIVSLSFiak5DGu7vLmkqJ9Hn74YQwaNAh6vR6nT59GY2MjHnzwQdVhuYTW/jhxZBneHUl1S0sL3n77bRw5cgRhYWF47LHHMGrUqH6fx7meRORpTEjJo1zV5c0lRfvdfffdOHToEMxmMyZMmIAFCxYgLi5OdVguobU/ThxZhndHUr1q1Sp8+eWXmDx5Mk6cOIGFCxfivffeQ1RUVJ/P41xPIvI0JqTkUa7q8nZkSdFsNmPz5s04evQogoKCcMcdd2D27Nl2v7e3Sk5ORnJysuowXM7eP0480UTkyDK8q5Pq1tZWfPvtt5g6dSpWrVqFqqoqJCUl4YMPPsDjjz/ukvcgInIVJqTkMa7s8nZkSXHNmjXYvXs3pkyZgkuXLiE7OxshISH46U9/avf7k3bY+8eJJ5uIbF2Gd0fFv7W1Fa2trdZ9w+Hh4QgLC8PJkydd8vpERK7EhJQ8xpVd3o4sKZaVleGaa67BSy+9hObmZtx///0oKChgQurl7P3jxJNNRLYuw7ujiSgkJATDhg3DN998gy1btqCoqAgGgwFGo9Fl70FE5CpMSMljVHd5X3311di9ezdef/11VFZWoqamBjNmzOj2OG8+890fObrfsWv10rKUf/HiRURGRgJwfinf1mV4dzURLV++HNnZ2di6dSuio6MRGhoKnU7n0vcgInIFJqTkMaq7vOPj47F9+3bs3LkTRqMRwcHBnTr+LXzxzHfqrgvT6OwAACAASURBVGv10rKU39zcDCGE00v59izDu6uJaMSIEVi3bh0AYN++fUhPT8fNN9/slvciInIGE1LyGJVd3lJKbNq0CdOmTcNrr72G2tpaPPHEE1i/fj1WrlzZ7fG+duY7dde1emlZyi8tLUVeXp7TS/lamOWZmZmJmpoahISE4PDhw7jqqqtw1113KYuHiKg3TEjJY1R2eUspYTabMXjwYAwYMABXXHEFIiIi0NjY2OPjfenMd+qur+qlq+aBamGWZ0JCAj7++GOYzWbMmTMHDz30EIKDg5XFo3VHjx7FRx99hKqqKgghsHbtWtUhEfkNJqTkFwICAjB27FgUFhYiPT0d9fX1KC8v77Fa5GtnvlN3fVUvi4uLXTIPVAuzPGfOnImZM2eqDsNpnkoUc3NzUVhYiLa2NgQF8T+PRJ7Ef3HkN1544QVs3rwZZWVlCAsLQ1paGu67775uj/O1M99V8sTMT0f0Vb3885//bFMjktY+mzdX9/qL3VOJYlpaGoKDg7FixQqUlJS47X2IqDsmpOQ39Ho9nnrqqX4fp3oagC/x5MxPe/RWvTQajTh+/Dh+/OMf99uIpLXP5s3Vvf5i91SiGBoa6rbXdvQYVyJ/4V2/tYg8QPU0AF/iyZmfrpCbm4va2lrMnTu338dq7bN5c3Wvv9jdmSh6Sm/HuBJROyakRF1o+cx3rVVZbD2O1VWNQu5WWVmJH/3oR3Y1Imnls3lz0tYx9vr6eqxevdortx70pq9jXG+//XbV4RFpAhNSoi60fOZ7b1WWqKioTo+zJIr79+/H4MGDe00UnWXrcay2nlik2qJFi1BaWmrX3Flv+WzeorKy0mu3HvSGx7gS9c83/rWTz+l6WlJtbS3efPNNvz4tqa8qy+OPP97psZZEcezYsaivr+81UXSWrcex2npiUW+01kDUkbOfjTobM2YMtm3bpmTrQVFREbZs2YLy8nKYTCakp6cjLi4OjzzyiFOvy2NcifrH42dIkyynJYWHh1urCf5+WpI9VRZLovjcc89h3bp1iIqKQkFBgctjuvrqq3H06FG8/vrryMrK6vE4VntOLOpNeHg49Ho99Ho9hBAoLi7WxH/MXfHZqLPAwEAEBgZ2+l5RURGeffZZHDt2zJoovvXWWy5/b5PJhPr6egwdOhSjR4+G0WhEfX29S157+fLliI2NxdatW1FVVcVjXIm6YIWUNKvjaUnfffcdwsLCXPr6Wqm65efnY9euXWhoaIBOp8OcOXMwffr0bo+zp8py9dVXY/fu3Xj//ffR1tbWY6LoCrYcx+qKE4tUNhD19XOihdOYLNxV3fOEnmI/evSodbpFx0QRgEsTxY7i4+PddpABj3El6hsTUtKsjqclTZw4EVlZWS49LUkrY3vy8vJQW1uLqKgonDt3DhkZGXjllVcwefLkbo9dvnw5srOzsXXrVkRHR/daZbEkivn5+ZBS9pgoOsvW41hdeWKRigaivn5OtHAak4WnkjZ36Cn25uZma0LqzkTRU3o7xpX7SInaMSElTep6WtLu3bsxefJklw6n18rYnqysLOvtmpoaJCcnIz8/v8eE1JYqS8dE8amnnsKQIUN6TBSdZetxrK48sUhFA1FfPydaOI0J+GHPtaUJqK2tDTk5OV6zjaCnhDMjI8Prxlf1hce4EvWNCSlpUtfTku677z63nZakhbE9Bw4cQEFBAUpKSmAymTBr1qweH9dblaWjjoliSEhIr4mis+w5jtVVVDYQ9fZzooWtH5Y91x2r4N6659qbtx70xVeOcSX3OnXqFHJycjBq1CgsXbpUdTgexYSUNMmTpyVpYWzP3r17kZ+fj/Pnz0On02HYsGE9Ps6WKkvHRLGqqgpBQUFuSxRtPY7VFVQ3EPX2c6KVrR8d91y7cmuLp3nz1gMiZ7S1tSErKwtlZWVoa2tTHY7HMSElTep6WpLZbHbbaUmLFy9GRUUFvvrqKxQWFgLwfIUrNTUVqampOH36NBYuXIiNGzciMzOz2+NsrbJYEsUDBw4gKirKbYmircexuoLqBqLeqrNa2frRcc/1rbfeirS0NK9MTH1hvyiRI7Zs2YKTJ08iNjZWdShKMCElTep6WtKjjz6Ka6+91uXvYzQaUVdXh8GDByMqKkpJhctkMllPqomJiYFOp4PZbHbqNS2JYmlpKcaPH++KMJVzdwPR0aNH8dFHH6G0tBQDBw7sdEKQLdVZlVs/uu65/uSTTxAbG+uWLS5E5Hpnz57Fe++9h6SkJHz99deQUqoOyeOYkJImdT0tqbS01C3vk5ubi8jISGRnZ2P69OlKKlwpKSkYOnQodDodKioqYDAYNNMsoyXuvia5ubkoLCzEpUuXcOnSpW739VedVbn1o+ue66SkJLftuSYi15JSYuXKlYiNjUVKSgq+/vpr1SEpwYSUfJKtsz07Vt1UVbgSExOxf/9+NDU1YeTIkVi8eHGPHfbkXmlpaQgODkZaWhoqKys73WdLdVZlw5Un91x31VdlmYj6l5eXh6KiItxwww1YvXo1qqurIaXEm2++iSeffFJ1eB7DhJR8kq2zPTtW3Q4cOKCkwpWYmMhKlgZYtk30pL/qrOqGq657rhsbG92257qrvirLRNQ/IQTGjRuH+vp6lJaWorm5GQBw6NAhxZF5FhNS8kn2zPa04Jnk5CjVDVdd91wvWLAAcXFxHnnvvirLRNS/hIQEJCQkWL9+8sknIaXExo0bFUbleUxIyWfZOtsTUF/hIu+m+sSmrnuuPamvyjIR2W/06NGqQ1CCCSlpTk/7Px3perd1tifgXIXL1v2q5Lu02ISmhYH9RGQ/fxuIb8GElDSnp/2fTz/9tN3ji2yd7Qk4V+Gy5yx6rTh06BByc3Nx4cIF6HQ63H///bjxxhtVh6WU5YSgkydPQgjR6YQgb0zuVAzsr6+vx+rVq1FVVQUhBBuciMhmTEhJc3ra/1lYWIh7773X5tewd7anMxUuR/arqpaTk4OAgAAMHz4c5eXleP7555GTk4MpU6aoDk0ZywlB0dHRiIyM7HRCkFZOY7KHioH9lZWVKCwsRFtbG4KC+J8XIrIdf2OQJnXd/zl16lS7nu/p2Z727FfVghdffBFXXXUVAgICUFtbiwULFuBPf/qTJhJSyxghT1fZLCcE9XSYgFZOY3KEu8eZdawsDx8+HGPHjnXb3GAi8l1MSEmTuu7/tLca5enZnrbsV922bRvy8/OtX7e1tSEnJ8ehJipnl5A7JlwVFRVobGzE4MGDXR6nIyxjhLRYZVN5GpOj3D2wv2tl2WQyobm52WNzUInIN2jrtz3RZV33f27dutWuRiFbZnu6MvGyZb/qsWPHUF5ejokTJ1q/FxAQYPd7Aa5bQq6trcWLL76IwYMHY8GCBS6P0xGWMUIrVqxASUmJx97XFipPY3KUu8eZ9VRZzsjI0Nz/dkSkbUxISXPccbZ7T1yVeNkTr06nw7JlyxAeHg4hhGOBwzVLyHV1dUhLS0NDQwNee+01hIeHuzzOnvRX3dXyGKH+kjuz2YzNmzfj6NGjCAoKwh133IHZs2d7OMofGI1GfP7552htbcXzzz8PwPMVbyIiWzAhJc3paf/n/fff75b3ckXiZc9+1aqqKtx7772Ijo7GrbfeirS0NKcSPkeXkC9evIhnnnkGNTU1WLNmDcaOHevWODvyxgYhwLZZtWvWrMHu3bsxZcoUXLp0CdnZ2QgJCcFPf/pTD0fbLjc3F9XV1Rg+fHinPzg8WfF2NVV7jInIvZiQkub0tP8zLCzMLe/lisTL1v2qkyZNQkxMDGJjY/HZZ5/hk08+QWxsrFPHhjq6hPzb3/4WJ06cwJgxY7B582YAwJQpU/DAAw+4Jc6OvLVByJZZtWVlZbjmmmvw0ksvobm5Gffffz8KCgqUJaSVlZUYMWIEYmJi3Fbx7sjS4FReXg6TydRpdJaraHmPMRE5ThP/moUQIwG8CyAGgATweynlf6mNilTpaf+nO7p2XZV42XoW/T333GO9PXv2bCQlJaGwsNCpRM/R/YHR0dG4/vrrAcA62sjy/90RZ08cqe6qrI7ZMqv26quvxu7du/H666+jsrISNTU1mDFjhsdi7GrRokVoaGjA7t273Vbx7sjS4DR06FAA6DQ6y1W0vMeYiByniYQUQAuAX0spDwghIgB8I4TIk1IeUR0Y+S5PJV4WRqMRer0eQHszkclkcqoT2ZnjTlesWOGxOHvTW3W3ryqbyuqYLWPD4uPjsX37duzcuRNGoxHBwcGd9iir4O6Kd0eWBid30vIeYyJynCYSUinlOQDnLt++JIQoBnAlACak5DaeSrwsHn74YQwaNAh6vR6nT59GY2MjHnzwQYdfz5njTvvi6jh701t1t68qm5arY1JKbNq0CdOmTcNrr72G2tpaPPHEE1i/fj1WrlypLC5P/+FFROQITSSkHQkhxgCYAmCf2kjI13kq8bK4++67cejQIZjNZkyYMAELFixAXFycw6/nzHGnXXXsDm9oaEBrayuGDx/ukjh70ld1t68qm5arY1JKmM1mDB48GAMGDMAVV1yBiIgINDY2Ko3L0394ERE5QlMJqRAiHMCHAJ6RUl7s6TG+cAKIL3wGFVx93aZNm4bi4mJUV1cjJiYGjz76KIKDg932v8+0adMwbdq0Tt9z5r3uvvtuAO2NNB01Nzfjww8/xIkTJxAYGIhbbrkFM2fO7PO1fv/732Pv3r2YOHEiIiIicPz4cdx3333WeF19TT799FN8//33mD9/vkOvfeHCBTQ0NLjtfytHX3fQoEH44osv8Nhjj8FoNKKsrAw33nij0n/zixcvRlRUFEJDQ3Hu3DnU19dj+vTpbonJk5/T3T8DnuQLn0EFXjfHqLpuXU/A60pIKT0USt+EEMEAPgXwZyllp06Furo6bQTpAj0dS0j943X7walTp5CTk4NRo0Zh6dKl3e5fvXq1dfTQ2bNn8f3332P58uV9dno/8sgj0Ol0WL9+vbU7fOrUqVi2bJlbPsOrr76K77//Hjk5OTaPIOrY0PT1119j+PDh2L59u8tjc+ZnzWg0YvPmzSgrK0NQUBBmzJiB++67z62d7f15//33rZX5yMhIt1S8Ac/9G+24x9hoNGLixIku7+T3JP5ucwyvm2O0ct2ioqK6/VLURIVUtP+2/r8Airsmo0T0g7a2NmRlZaGsrAxtbW09Pqbj6KHi4mI8//zz/Y4e8nR3uC0NQl11bGi6dOkShg8f7obIOrN30L1er8dTTz3l9rjskZycjOTkZNVhuIwnOvmJyPM0kZACmAFgAYB/CCEOXf7eb6SUOxXGRKQ5W7ZswcmTJxEbG9vrYzomlyUlJTYll1rsDgc6V0VbW1uxbNkypKWlob6+3m1zLjty1aB7rZ3g5M080clPRJ6niYRUSrkHgLo1LfIp+fn52LVrFxoaGqDT6TBnzhxMnz5ddVhOO3v2LN577z0kJSXh66+/Rm/bbTomlzU1NdDr9X0ml1rtDge6D0Fvbm6G2WzGgAEDMHr0aLdUx44fP44dO3agqqoKf//73zFjxgynB91r7QQnIiKt8d7z44h6kZeXh9raWuj1elRUVCAjIwOHDh3q/4kaJqXEypUrERsb2+epTB2Ty48++ghr165FZGQk1q9f3+dztNgdDrSPedq2bZt1iH98fDx+/vOf47rrrsOGDRuwYcMGPPPMMy59z7/97W8oLCzEyZMnAbRXaV9//XVkZWU5vJWh4zaKdevWISoqCgUFBS6Nm4jIm2miQkrkSllZWdbbNTU1SE5ORn5+fo/HeXqLvLw8FBUV4YYbbsDq1atRXV0NKSXefPNNPPnkk9bHdU0uBw8e3G9yGRAQgLFjx6KwsBDp6emor69HeXk57rrrLk98tD6pGPP00EMPYeLEiVixYgXq6upgMBic3sqgtROciIi0hgkp+aQDBw6goKAAJSUlMJlMmDVrluqQnCKEwLhx41BfX4/S0lI0NzcDQLfKb9fk8vvvv8fZs2f7TS5feOEFa3d4WFgY0tLScN9997nt87iaK48UHTBgAAIDAyGlRHl5Oe644w6ntzJodY8uEZFWMCEln7R3717k5+fj/Pnz0Ol0GDZsmOqQnJKQkICEhATr108++SSklNi4cWO3x3ZMLvV6vU3JpRa7w7u6ePEinn32WY8eKdrW1ub0VgYt79ElItIKJqTkE3pqZEpNTcXp06excOFCbNy4EZmZmarDdJnRo0f3el/H5LLrzLlt27YhPz/f+nVbWxtycnK6nZakRa2trW47UjQjIwMXLlwA0J74RkZGorS0FHq93umtDJ7ao+vKKrFW+OJnIqKeMSEln2BpZIqKisKZM2eQkZGBV155BRMnToROp4PZbFYdokv1NBDfFseOHUN5eXmn5WJbB9Or0HEIuk6nQ2RkZI9jnpzdaxoeHo6mpiYAwKVLl1BcXAwpJcaPH4/bb7/dqa0Mntqj664qsUq++JmIqGf8F04+oWMj0y9+8QucPn0aS5YsQUxMDAwGg0OD2H2VTqfDsmXLEB4ervQEIVt4Ygj6tm3bUF5ebv3622+/xcWLFzFhwgQ0Nzfj9OnTuO6665yadeqJPbrOVom1yBc/ExH1jAkp+QxLI1NTUxPa2towdOhQjBw5EosXL/bqDntXq6qqwr333ovo6GjceuutSEtLszkx9fSSvyeGoFuqxsOGDUNpaSnOnTuHwMBAjBs3DoBrkmBP7NFVMZHA3XzxM5Hv6+94Z+oZE1LyGZZGJqPRiLi4OKxZswYxMTGqw9KUSZMmISYmBrGxsfjss8/wySefIDY2FomJiTY939uW/G2l0+lw5ZVXoqysDAEBARg1ahQ2bNigOiwi8jK2HO9MPWNCSj4jNTXVpxuZXOGee+6x3p49ezaSkpJQWFhoc0IKaHPJv+NeU0eOFK2qqkJFRQUMBgMCAgL4hwwROcSW452pZ0xIySeYTCbr8l5MTIxPNjK5gtFohF6vBwDU1tbCZDIhJCTErtdwZsnfXZzZa2qpGg8dOhTLli1Dc3Mzqqur3RkuEfkgW493pp7ZnJAKIV4F8I6U0rvPYCSflJKSgqFDh0Kn01krXWxk6u7hhx/GoEGDoNfrcfr0aTQ2NuLBBx+0+fnOLvm7izN7TS1V4z/84Q8YPHgwTCYT6urqXBmeRzhbJdYiX/xM5Ju6Hu/89ddfqw7J69hTIQ0E8GchxHkAWwC8L6U8456wiOyTmJiI/fv3o6mpiY1Mfbj77rtx6NAhmM1mTJgwAQsWLEBcXJzNz3dmyd9sNmPz5s04evQohBBobW1FQEAAgoKCcMcdd2D27NkOfSZb9TbTsqioCDt37sRf//pXNDY2IigoyO59sbY0e7l7pqYnJhIAvX+O4uJivP/++7hw4QJ0Oh3uv/9+3HjjjU69l6c+E5GzbD3emXpnc0IqpXxaCLEIwL8CSAbwWyHEPgDvAvhISsnfEqRMYmKi8iqdN0hOTkZycrLDz3dmyX/NmjXYvXs3pkyZgoKCAhw/fhw/+clPEBUVhezsbISEhOD8+fNu6+Lvbablww8/jPr6egQGBqKpqQlCCIwYMcJ6vy3Jpi3NXu6eqemJiQRA75/jrbfeQkREBIYPH47y8nI8//zzyMnJwZQpUxx+L099JiJn2Xq8M/XOrt+KUspWAJ8C+FQIcR2APwD4fwDeEEJ8ACBTSnnW5VGSz/Dmk4J8XccKZm9VS2eW/MvKynDNNdfgpZdewn/8x3+guroa1113HdLT03H//fejoKDAen68O7r4e5tp+dRTT+Gf//wndu/ejbq6OsTFxSEoKMi6PFxRUWFTTP01e/nKTM3ePsevfvUr/OxnP0NAQABqa2uxYMEC/OlPf3IqISXyFvYc70w9syshFUJEArgfwC8B/BjAhwBSAZwG8GsAuy5/n6hHvjo2yBd0rGBeunTJWrX86U9/an2MM0v+V199NXbv3o3XX38dZ8+excWLF2EwGJCVlYWamhrMmDEDe/bscVsXf28zLVNSUgAAjzzyCPbs2YPY2FhERkZ2Wh62JabTp09j6tSpCAgIwIgRI5CXl9fpsb4yU7O3zzFmzBjrv+WKigo0NjZi8ODBngyNSDP6Ot6ZemZPU9MOALMB5APYCCBXStnU4f7FALyvE4A8Totjg6hzBbO5udlateyYkDqz5B8fH4/t27dj586dMBgMaG1txbfffovW1lYEBwdj4sSJ2LNnj7Iu/uHDh+NHP/oRMjIyMH78eOv3V65c2W9MkyZNwrfffougoCAYDAYcO3YMH374oV9uI6mtrcWLL76IwYMHY8GCBarDIVKCA/HtZ0+FdC+Ap6SUFT3dKaVsE0JweB/1S4tjg6i9gvnXv/4VycnJOHXqFM6dO4eZM2e65LWllNi0aROmTZuGV199FUlJSaivr8dNN92ERYsW4YknnsD69esRHx+vuS5+WyYL3HPPPUhISEBwcDAyMzPxwQcf2D3f1RfU1dUhLS0NDQ0NeO211xAeHu7U67m7EYyItMOepqZXbHiM0blwyNdpdWwQtVcwf/e736GkpAShoaGQUuKPf/wjbrzxxk5VUkdIKa0d00uXLsV3332HkJAQNDc344orrkBERAQaGxtdMrjflr2wvWloaMDvf/97tLS0WBMgW2Lq2OxlMpnQ1tZm93xXb1dfX4///M//RE1NDdasWYOxY8c6/ZrubgQjsgePBHUv/gsnj3JFwkGuZ6lgRkREYObMmcjMzMTjjz+O7777rtuyvSMCAgJgMBhQVlYGg8EAg8GAxsZGHDt2DAsXLkR5eTnuuusulwzu720vbHR0dI8zLadOnWr9/tmzZ3H8+HFERERgzJgxAGybLNCx2SsvLw+tra3dmr18ZaZmb59jz549OHnyJMaMGYPNmzcDAKZMmYIHHnjA4ffylUYwX+DvyRiPBHU/JqTkUa5IOHxdfn4+du3ahYaGBuh0OsyZMwfTp09363tKKWE2mxETE4PvvvsO27dvR3l5OYxGI2bMmOH067e2tmLQoEGYNGkS4uLicP311yMvLw9msxlhYWFIS0vDfffdh6SkJAwaNAgDBgxAQUEBLly4gMGDB+PPf/6zzVXO3vbC3nHHHT3OtOw46zI6Ohr19fUwGAzW17NlskDHZq/o6GiMGDEC1157bafH+MpMzd4+R2RkJK6//noAsH4uZz+frzSCeTsmYzwS1BOYkJJHOXtSkD/Iy8tDbW0toqKicO7cOWRkZOCVV15x66D/gIAAjB07Fnv27MHZs2dx4sQJ1NfXIyYmptNEBEe0tLRg06ZNOHbsGEaMGIFFixZhyJAhmD9/Pq699lqsXr3a+lhLYrdv3z7U1tZi1qxZCAoK6rHjvzcdu/m///57HDt2DAMGDEBtbS3mzp3bY2LbcdZlaWkp3n33XWtFzhJTY2MjTCYTrrzySrz99tudtgJ0bPbKyMjosZqnhZmahw4dQm5urlPD63v7HKWlpZ2awSwj3p566ikAHPHmzfw9GeORoJ7BeTvkUXfffTfCwsLQ3NyMCRMmYP369d0qSf4uKysLb775JrKzs/Hqq68iODi40+xWd1mxYgWklBg6dCjuueceZGdnY8yYMVi/fr1Tr7tq1Sr88Y9/RFhYGE6ePIl58+Zh6dKlMBgMMBo7bztPTk7Gyy+/jLi4OPz85z/Hpk2bsG7dOkRFRaGgoMCm94uPj4fBYMDOnTvx4Ycfoq6uDkOHDkV9fT2ys7Px2Wef2RW/JaYrr7wSjY2NGDJkSI+vVVRUhGeffRbHjh2zLmW/9dZbNr3H0aNHsXr1aixatAiLFy+2Kz575OTkoLS0FMHBwdbh9QcPHnTLe1lGvIWHhyM8PByRkZEc8eaFOiZjzjapeaOuR4KS+7BCSh7l7ElB/uLAgQMoKChASUkJTCYTZs2a5fb31Ol0iI2NxTXXXIOVK1dCSom//e1vaGxsdPg1LaOdpk6dioULF2L58uX43//9Xxw4cAChoaHQ6XQ9Pq9jlbOystI6p7Q/Hbv5X3vtNTz88MP45ptvMHDgQGRmZvY4yspW/Y3FcmZJvrfmHVdUNDt68cUXcdVVV3lseL3qEW/+vu/RWTyfnUeCehITUiIN2rt3L/Lz83H+/HnodDoMGzYMgHMd5P2xLNsXFhYiPT0d9fX11mYjR7W2tqK1tRV6vR4jRozAunXrMH/+fERHR+P48eO4+eabe3xex5mlRqPROqe0P5a9sIMHD8aAAQNw/fXX48svv8T+/fs7DeB3RH9JsjNL8r017+Tk5CAgIKDTcZzZ2dmoqKjAX/7yF4SGhuKRRx7B1VdfbdP7dFxS98TwemdHvDnTCMZ9j85jMsYjQT2JCSmRBqWmpiI1NRWnT5/GwoULsXHjRmRmZtp0mhLww/69ixcvIjIy0ub9ey+88AI2b96MsrIyhIWFISEhAQcPHsSXX37pUINVSEgIhg0bhm+++QaJiYk4ffo0qqurERQUhJkzZ/aY7HatctbW1lrnlK5cubLP9+uaVJeWlqKhoQG1tbX44osv+k1si4qKsGHDBly8eLFbAuRokmyL3pp3eqporl27FmfOnMGPfvQjlJeX4+mnn8a7776LIUOG2Px+nhhe74oRb85Unf1936MrMBnjkaCexISUSGNMJpM1QYmJiYFOp4PZbAZg22lKwA/794YPH27d92XL/j29Xm9tQgHaG3Tq6uqcarBavnw5srOzcfDgQZjNZgQEBGD8+PHYsGEDgoODuz2+a5Wz45xSW1iS6u+++w7Hjx/H1KlTrXtJ+0tsTSYTjEZjtwTImSTZGT1VNC9duoQJEyZg3bp1qK6uxi9/+Uv84Q9/wNNPP23Ta7p6eH1vLCPejh49ioMHD+L8+fNYu3atXQmpo1VnNqG4BpOx7ngkqPswISXSmJSUFAwdOhQ6nQ4VFRUwGAxYtGgRAPv2Vup0OjzxxBOYNGmSw/v3srKyrLdramqQnCPkrAAAIABJREFUnJyM/Px8uxJSy1I9AOzbtw/p6el49NFHreO/OmppacHbb7+NM2fO4PDhw6iurkZAQIBdWwcsSXVxcTH+/ve/o7a2Fr/5zW+wZs2afhPb+Ph4rFixolMiCLQv/zqTJDurY0WzqakJV155JYQQGDp0KIYPH44zZ87Y9DoXL17EM88849Lh9b2xjHjLzc3FV199hUuXLnmkqYn7Ht2HyRiPBHUnJqREGpOYmIj9+/ejqakJI0eOxOLFi60JoD3LxlVVVUhNTcXw4cOdOqLV2QarzMxM1NTUICQkBIcPH8ZVV13Va3K5atUqfPnll7jlllvw1Vdf4fPPP8fs2bOtc0rt8cknn6C5uRlnzpzBxYsXOw3gt5c79tfaqmNFMzs7G0uXLsWAAQOs94eEhNicGP/2t7/FiRMnXDq8vjeWEW8DBgywNrCNGDHC5e/TFfc9ug+TMXInJqREGpOYmNjjsqY9y8aW/XuBgYEoKSlx6ojW3hqsbJWQkICPP/4YZrMZc+bMwUMPPdTjUn3HjvxVq1ahqqoKSUlJuPbaazFnzhy7405LS0NqaioefPBBnDx5stMAfkd03V/rzGt1VVRUhMzMTJSWlqKlpQXx8fGIiIjAu+++i2XLllkrmuPHj0dwcDCampqszzWbzRg4cKBN7xMdHe3y4fW96XhYwDXXXIMrrrgCVVVVbnmvjrjvkcg7MSEl8hL27K207N8rLS1FSkqKU0e09tZgZauZM2di5syZ/T6uY0c+AISHh1tnlzoiNDQUoaGhuOGGG6DX6/Hyyy879DoWXffXupLJZEJVVRVaW1utyWVgYCCysrK6VTQvXryIs2fPQkqJ6upqnDt3DjfccINN77NixQq3xN+TriPeMjIyPJKQct+jfTgai7SCCSmRl7Bn2dhVR7T21WBlK1tHVXXsyN+yZQuKiop6HJ7vi+Lj43HnnXfin//8JzZt2mSd27lixQoEBgYC+KGSOWHCBPzjH//A008/jZqaGgQGBiIpKUll+JrGfY+942gs0hImpERexNZlY8v+PbPZjIsXLzp8RGtfDVa2snVUFfBDR/7WrVsRHR3d5/B8X9R1bmdmZma3fb9SSuzatQt/+ctfMGrUKLzwwgt2jXzyN6z69Y6jsUhLmJASeRFbl40t+/eOHj2Kc+fOITAwEAsWLICUEjfeeCPWrl1r05nifTVY2crWUVVAzx35vQ3P9zW2zu0UQuDOO+/EnXfeqShS++zatQvLly9HW1sbRowYYddwe3IfjsYirWFCSuSDLPv3Fi9ejPPnz1v3Zkop7TpTvGOD1bZt2zqdzW7rsP2uo6qqq6tx4cIFLFq0qNsSvj0d+f1x5pQfFSz7fgFg9uzZTu371Yq2tjb87ne/g8FgQFRUFEaPHm3XcHtyD47GIi1iQkrk44KCghAXF4fNmzcjIiLC4ZmklmH7HcdM2ZLYdh1VZTAYUFhYiGnTpnVbwre1I98Wzpzyo4Ir9v2682hZR2zZsgX19fWYMWMGwsLCsGHDBmWx0A84Gou0iAkpkY8zGo0oKCjAddddhyuuuAK//OUv8cwzzziUmOp0OixbtszadNMTy3D7I0eOQK/X4/Dhw51GVd16660wm809LuHb2pFvC2fOllfBsu9Xr9fj9OnTDu37tWe/rrv545Kwt3SsczQWaRETUiIfNmHCBLS0tCAwMBBnz57FwYMH8c4772DkyJEOLQV3bbrpadj+qlWr8MUXXyAkJARnzpxBZWUlfvKTn1hHVQ0aNAjV1dU2nTaldUePHsVHH32EqqoqCCGwdu1ah1+r49zOCRMmYMGCBYiLi7PrNezZr+soW6qw/rgk7E0d6xyNRVrEhJTIh91+++14/PHHAbT/B3P+/PkoLi52aG+iLU03luH2Qgg0Nzfjtttuw/bt2/HZZ58hKSkJAwcOREtLCwDYdNqU1uXm5qKwsBBtbW0ICnLu12nXuZ2OsOdoWUf1VoXt2Kntj0vC3tyxztFYpAXuP1iYiJQxmUzWOZ61tbW4dOkS2traHJpJes899+DRRx/Fv/7rvyI7OxtXXHEFCgsLOz3GMtz+0qVL1krdTTfdhNDQUJw9exZ6vR6RkZG4/fbb8dFHH+GDDz5AZGQk1q9f75LP66ijR49i9erVWLRoEbKzs21+XlpaGrZt22Y9/Ui1+Ph4GAwG7Ny5E1988YVbkv2OVdh169YhKioKBQUFnR7T05JwS0uLzy4Jd9yeEB4erjocuy1dulTTWwzIP7BCSuTDfvOb3+D48ePQ6/UwmUy4dOkSRo4c6dBMUluabizD7U+dOoU9e/Zg7ty5KCsrQ2BgIF544QXcdttt+Ld/+zcMGTKk39OmPKljpbPjsZz9sRwaoAX2HC3rDFuqsP60JOyP2xOI3IEJKZGXy8/Px65du9DQ0ACdToc5c+Zg+vTpANqX7AMCAlBZWYnIyEjcdtttSEtLs3tvImB7083y5cvx9NNPY8+ePairq4PJZEJ4eDgmTpxo12lTnpSWlobg4GCsWLEC33zzjcted9u2bcjPz7d+beuoLEfYc7SsM7pOTbBUYS9evNjrc3x5SdgftycQuQMTUiIvl5eXh9raWkRFReHcuXPIyMjAK6+8gsmTJ+Puu++2+2Sl3tjadDN8+HCEhIRg7ty5SE5ORnp6OgBYK3UvvPACNm3ahJ07d6Kurg5XXnkloqKiXBKjo+ytdHZNNAsLCzF8+PBuj3N0VJYjPJHs91WF/fd///den+fLy8Hu6Fj3lm59IldiQkrk5bKysqy3a2pqkJycjPz8fLtPVOqPrU03mZmZOHToEKKjo7Fy5Upcc801MJvN1kqdXq+H0WhEW1sbbrvtNly6dAk5OTkYMGCAkvFEjuiaaA4YMKDXMVi2jMpyFVuPlnWUp6qw3sTV2xO8qVufyJWYkBL5gAMHDqCgoAAlJSUwmUyYNWtWj4/7/+yde1yUdfr+rxkYYABBQBQUARW1g6hoHrNtXSOz9UCFlcesTAsNsC3UVFSKFTQST2VlVuqa4uZi35TS0l9UauIBXUUREOQscj4Ow+H5/eH3me8wzHmeZ+YZuN+v175WZOaZe2aE7rk+931dyh6hTk5OWLJkCXx9fTVe19DbA8DTTz+Nn3/+GWVlZejRowdsbW2Rm5vbIYnIHPZEfCOVSjFr1iz8+9//hpeXFxobG9WmQeljlcUV+kbLGotQRy6EQlJSEm7cuAEAWL58uVEjGta8rU8QpkANKUF0Ac6fP4/U1FTcv38fUqkUXl5eSEpKwg8//AAXFxcAD5QXNzc3pKWlYeTIkcjNzcWyZctw4MABjUfmsbGx+OOPP/S+PQBMmjQJP//8s0Kps7W17aTUmcOeiG/KysoQERGB2tpaeHt745FHHumUBqVvPr01oUmFzc7OtnRpFuf27dtwc3MzekSjO4YJEAQLNaSE2dC2fCNk0tPTkZycjKqqKkilUsyePRujR4+2dFkdCAsLQ1hYGPLz87Fs2TLs3r0bNjY2KCkpQd++fQE8aEhv3LiBMWPGIDY2FmVlZZg7dy4OHTqk8CpVhvUU1ff2yuhS6jQtxlgK5dx7uVyuM/detdG8ePEiJk+e3KnR7Ir59HyrsNaOsSMatK1PdHfIh5QwG+zyjaOjI0pLS7Fu3Tqz+xKmpqZi9erVCA8Px8qVK3Hu3Dmd94mPj0dWVhYkEgkKCgqwevVqXLlyxQzV6odMJlP8uU+fPpBKpZDL5QAeLOusWbMGmzZtUlj/sNZNzs7OcHJyQl5entrrsp6i+t5eX5QXY4TiRaqce9+3b1+duff6eLICUHjAAsbn0xPWBTuiERoaisTERL1VTnZb38nJSbGtX15ejk8//ZTnik3j7t27CAsLM8i/lyDUQQopYTbMtXyjTdHUtpGuiZiYGAwaNAhisRjV1dVYsGABjh8/jqCgIE7rNpZFixbB09MTUqkUpaWlqKiowIoVK/DLL7+gsrISM2fORM+ePeHg4ICCggLFUWthYSEqKio6NE3KsJ6ily5dwv79+3H16lWtt9cXIS7GKOfeZ2VlYfDgwVpvr48nK8BNPj1hPZgyomGN+fLWuoBFLgbChBpSwqzou3xjCvHx8RCLxfD29lYomvHx8QgKCjKqKVZuTkpLS9HU1AQPDw/O6zaW0NBQXLhwAc3Nzejfvz/eeecdjBw5EuXl5RCLxQgKCkJ8fDxu376NoKAg5OfnY+vWrZg4cSIcHBwglUo1Xjs6OhpxcXE4fPgw3N3ddd5eH7rCYoy+jSYX+fSE9aA6ovHcc89h8+bNyM7O1tn4WGOYgDUuYFlrE90doIaUMCvqlm+4RpeiaWxTXF1djZiYGHh4eGDBggWc120soaGhahWYGTNm4KGHHsLAgQPxxRdfoHfv3ggMDMRXX32FuXPnYsCAASguLsb48eM1Xrtv377Yvn07AODPP/9EVFSU1tvrC9/2RMrI5XLs3bsXmZmZsLW1xVNPPYWpU6eadE220bx58yYqKysREBCATz75pNNWNRf59IT1oKycV1ZW4ubNmwBg1JiL0MMErHUByxqb6O4CNaSEWVG3fLN+/XpOH0OXomlMU1xTU4OIiAg0NDQgMTHRKvKq2aP1trY2NDc3g2EYpKWlYf369SguLsbRo0cxceJErcrk+vXrUVlZCTs7O9y4cQODBg3iRMk052JMQkICTp8+jaCgINTV1SEuLg52dnYmWUyxjeaHH36ItLQ0xeIYwJ/xPUtmZiaOHj2KsrIyiEQifPzxx7w+HqE/ysr52bNn0djYiFGjRhl1LSEfJVvrApa1NtHdBVpqIsyGtuUbPtCkaIaFhSEpKQnffPMNbGxsdB6J1dbWIjIyEpWVldiyZQsGDBjAW81c8vrrr2Pjxo2KPPuqqio89NBDuHr1KpqamtC/f3/s3LkTEolE4zWCg4Ph4OCA1tZWhISE6Ly9EFH2PN2+fTtcXV1x9uxZk6+blJSEH3/8EdnZ2aiqqkJNTQ3WrFkDJycnDqrWTHJyMi5evIi8vDwUFBTw+liEYUyfPh1OTk6orq5GZWUlli1bhn79+lm6LM5hF7AYhsETTzyBP//8U/ALWKpNNCE8SCElzIam5Rs+0KRoymQyRUykvk3x2rVrkZubC39/f+zduxcAEBQUhJdeeomX2rli+vTp+PXXX9HS0oKpU6eiqqoKd+/eRUBAABwdHTF69GjF8aI6VOMxr127hra2NnOUzil8eZ7evn0btbW1kMvlOH36NOzt7fHpp5/ivffe4zWRKSIiAhKJBBs2bMCtW7d4exzCcObNm4e5c+ciLCwMEyZMwMqVK7Fs2TJLl8U57ALWxYsXUV9fD3t7e7S2tgp6AYttokeNGqVwMWAYBp9++ineeustS5dHgBpSwoxoWr7hGmVFMyEhoYOiaUxT7O7ujmHDhgGAwgpImyWQUJg3bx7Gjh3baWNc31lQXTnsfMxm8gGfnqceHh54/vnnMWjQIPy///f/8OOPP2LgwIG8+oyyH6gIYdIdGp/g4GAUFxejtLQU3t7e+O9//wsvLy9BL2BZo4tBd4MaUsJsaFq+4RptiqYxTfGGDRt4r5lvjJ0F1WbyzcdsJtcoe54mJiaiuroab775Jnbs2KHwZTUFkUiEo0ePwt3dHY8//jg8PT2t3vieMI3u0PiozmI6OzvD39/f0mVpxRpdDLob1JASgoGrJCdtiqa6ptgakphMJTg4GMeOHYNcLkdISAgWLlyo1yyothx2a8ij59PzdMSIEXBzc8PAgQNx5swZJCcno6WlBUOHDuWgcm5gGAYpKSk4efIkHBwcsHjxYgQEBFi6rC6NUBofvrw21S00DRs2TNBLWOoQuotBd4QaUkIwqJrWR0REIDAwEE5OTmhubsaiRYv0alANVTS1+ZZ2FSZNmoRJkyYZdB9dJt/WkEfPp+fpjBkzMGfOHNy4cQNSqRQlJSUQi8WCMr5PTk7Gtm3bEBgYiIKCAoSHh2Pfvn3o1auXpUvrNlii8eHTa7OrjCRYWwPdHRBMQyoSiZ4BsA2ADYA9DMNQDlk3Q9W0ftKkScjOzsaECRNQWFioV6qSMcyYMQPXrl1DY2MjPD09UVBQIKgkJkuhK4dd02ym0GZL+fI8bWxsVPiR1tbWwsHBAX/961/xyCOPcFC1Zq5evYr9+/ejoKAAMpkMUVFRGDJkCBYvXtzptikpKRg6dCi2b9+O8vJyzJ8/HwcPHkR4eDivNVoCZUVwzpw5gkni0ffxuVQ0+fTa7A4jCYRlEERDKhKJbADsAhAMoBBAmkgk+p5hmAzLVkaYG2XT+j59+iAxMREjRoxAWloaoqOjeYkavXnzJmpqauDq6orbt28jJyeng0VVd0VbPKa22UwnJydBzZby5Xmq7DlZVVWFvn37mkUhkslkqK+vh6enJ4AH75O6JTuGYVBZWYnhw4dDJBLB09MT3t7eKCws5L1Gc6OsCLa1tVldEg+XiibfXptCGUkguh6CaEgBjAWQzTDMHQAQiUSHAMwCQA1pN0PVtL6srAw7d+7EhQsXeIsaZZXZ6upqLF68GBKJBK6urpw/jrWhLR5T22xmaWmpIGZL+TaQt1Qs6Lhx4zBu3Didt5PJZGhpaYG9vb3i7+zs7DiZnxUayorgnTt3wDCMVSXxaFI0DVVNLWFYT7OYBFcIpSHtB0DZ4bkQgO7fuESXQzXJaefOnbC3t0dhYSF69uzJS9Qo8GChavXq1aioqEDfvn3x9NNPc3ZdLha1LIG2hkvbbGZubq4gZktZA/n29nbY2nL/q07osaAODg6QSCRobm5W/J1cLkfPnj0tWBX3KCuCv/76K+7cuYM1a9ZYTRLPvXv31CqaxqimlpjvtPRIBNF1EEpDqjdZWVmWLsFkusJz4IPm5maFmiOXy9He3o7+/ftjxYoVKCkpQUxMDDZt2qTWaPrmzZv45ZdfUFNTAwcHB0ydOlWxaa+L+vp6vPvuuygtLYWnpyfs7e3R2NjIyfuUlJSEqqoq9OjRA4WFhXjvvfcQFRXFmQ+mOlpbW/Gf//wH2dnZkEqlePHFFztEW+rL2LFjMXbs2A5/p/yaLFy4EN999x3y8/Nha2uLF198EUFBQWhtbUVJSQm+++47NDU1QSwWw97e3uz/7v/+979j1qxZ2LlzJ+7cuWPQ43eVn1FbW1vcvHkTt2/fRlVVFe7cuQNfX1/enp+5XzeGYbBx40a4urpi4sSJSEhIgEQiweOPP45ffvkFDMMI+r1km0VXV9dONf/nP//BrVu34OnpidraWmRlZaGoqAh79uyBt7c3lixZ0ul6xcXF6NOnD0pLS1FaWora2loAwG+//YannnrK3E9PJ7qejy6E/N4KGUu9bqqe2KqIhPAJUiQSTQCwgWGYqf/79WoAYBhmEwDU1NRYvkiOyMrK0vmmdFdefvnlDqb1BQUFePHFF5Gfn4/CwkKkp6fjsccew1dffdXpvnPmzFFsypeUlOD+/ft6b8qHh4fj2rVr8Pf3h5OTE86cOYPhw4fj0KFDnD6/yspKzJs3D9OmTeN1qWTjxo34448/MHLkSGRmZqK9vR0HDhwwyxgCwzCYN28eXF1dO8yWPvroo5z4frIYsji1bt063Lp1C0eOHNHr2tb0M9ra2oqvvvoKGRkZcHJywpIlS+Dr66v4/n/+8x/Fln1lZSWqqqp427K3xOt28uRJbNiwAaNGjUJTUxN+/PFHuLq6YujQobC1tQXDMJgyZYpgt79PnjyJ1atXY8KECfD29kZ6ejoYhsHo0aNx+vRpzJkzR6GafvLJJ1iyZAlycnIwdOhQvWY2hTzf2d7ebvDzUcaafk6FhFBeN1dX105xdkLJsk8DMFgkEg0QiUR2AF4G8L2FayLMTGhoKKRSqcK03sHBAfv378fPP/+MK1euoK6uDhkZGWq3OWNiYrB//3589NFH2LVrF+zt7XH8+HG9HtfFxQXDhg2Ds7Oz4missbGRs+d1+fJl7Ny5E9HR0bzNwbK0tbXh2rVrGDNmDDZv3ozVq1ejqamJ8+ZaE3z6fiqTkJCA7777DhKJBPX19YiLi8OZM2c4fQxrIDY2FkeOHIFEIkFubi6WLVuGmpoaxfdDQkIQFRUFGxsb+Pr6Yvv27V3K8kl547u4uBhSqRQtLS3Izs5GS0uL4OMsRSIRfH19O2yst7S04PDhw50y143ZnPfz8xOsYT2fTgCEdSKII3uGYVpFItFyAD/hge3TXoZhbli4LMLMqJrW//vf/1akKrW0tODll1/Gpk2b1G7aK3/iKy0tRVNTEzw8PDrcRtM8Z3Z2dgdl1tvbG6tXr+bseakuavE1Bws8aEjb2toU2/FOTk5wcnJCXl6eUdfTpcCpwqfvpzLWYMrPN8ofPmJjY1FWVoa5c+fi0KFDWLp0KYAHDc+zzz6LZ5991sLV8oO2jW8hq4MswcHB8Pf3V/z+euutt1BUVARHR0c4OTkp5kCbmprw0UcfYcWKFQbNxgp1vpNvJwDCOhGKQgqGYU4wDDOEYZhBDMPEWroewvKEhoZi8+bNeOWVV9C7d28kJSXpVBirq6sRExMDDw8PLFiwoMP3WON9R0dHlJaWYt26dUhPT++kzCYkJHC6eBQWFoakpCR88803sLGx4fU/kHZ2dvDy8sKlS5ewf/9+bNu2DRUVFUYrvroUOHVs3LgR06dPR0tLi8L388UXX+xwm9bWVnzxxRdYsWIF1q5di/z8fIPqCggIQGZmJnbt2oUPPvhAkKb8fKP64cPZ2dmkDx9dAWVFUMjqoCb8/PzQp08fDBw4EPfu3cOhQ4eQmZmpmPlTVkwN5e7duwgLC0NcnGUtvlWdAAiCRRAKKUFo4/z580hLS0NjY6NWhbGmpgYRERFoaGhAYmIinJ2dO3xf1Xh/3rx5SE1NRXh4OG/Z4zKZDA4ODgCAPn36QCqVQi6X8/JYLNHR0YiLi8Phw4chkUjg4OAAqVRq8HX0UeDUoY/vZ2xsrGLOlW10DZlz1WTKr4yqgfxzzz2HhoYGhVNAe3s74uPj0aNHD70eU2iofvi4evWqSR8+ugLKiqBQ1UFtsDWz85W9evVCUVERmpubERwcbPTmPJ/JTYbSVZKeCO4RjEJKEJoICwtDYmKiVoWxtrYWkZGRqKysxJYtWzBgwAC11zLnPCfwQNF4++23ERUVhTfeeAMVFRWYPn06r4/Zt29fbN++HT/88APmzZuHlpYWjB8/3uDr8KXAqc65bt261aA5V2VT/qNHj+LQoUNwcXHBjh07OtxO2UDez88P9+/fx/379+Hs7AxnZ2e4uLhALLbuX4HR0dHw8fHB4cOHUVZWZvSHj+4KwzA4ceIEIiMjsWrVKmRnZ1u6JAAd5yulUin69OnTYc7U0NlYIc1rqkt6EvqsL2EeSCElBI2+CuPatWuRm5sLf39/7N27FwAQFBSEl156qcPtzDnPCTwYO2DnYPv374933nmH86QpVdavX4/KykrY2dnh4sWLGDRokFEznHwpcKY2uvouTqkayH/44Ye4fv061qxZA2dnZ4hEnZY8rQ72wwcA/Pnnn4iKijLqw0d3JTk5WeFCcOvWLUybNg3jxo1Dr1694ODggMWLFyMgIICzx2MYBikpKTh58qTi+qqozldOmDChw4dwQ2djhTavSUlPhCaoISUEzaJFi+Dp6Ynm5mbIZDJUVFRgxYoVnW7n7u6u8B1lYxTVxSmqGu/v3r0b69ev561+1UUtcxAcHIxjx45BLpdjypQpePfddyGRSIy6lvLxv7u7OycKnKmNrimLU2VlZZg5cybc3d3xxBNPICIigvPG1NBFMFOu++WXXyo+fNy4ccPoDx/dlZSUFAwdOhSJiYl45ZVXUFtbi19++QWhoaEoKChAeHg4pzZZyg0we/0NGzYovq9P0pIhyUjmSG4yNE1KFUp6IlgE4UOqC/Ih7b6wm/ZlZWXo168fZs+ebbTCqKy2Njc3Y8GCBRg8eDBiY7vuDp2mf2+G+HiysArcihUrEBISYlJdxcXFiIuLw507d+Du7o7i4mI89thjei9cNDY2Yu/evcjJyYGtrS0ef/xxzJo1S2tz+T//8z8oLS2FSCTCwYMHcffuXQwbNgzHjh3rcDtTf0aVfWCLiopQW1vLiQ+suusuX74cP//8M+RyOQYPHoz29nbk5ubq/Z5yiTl/t5naBAEPmrXZs2dj+PDh8PPzw/79+3H9+nVIJBLk5+ejvLwc8+fPx9///nfOfIOXLFkCkUiE3bt3K64/btw4xMTEAOjoq6rsS2qslyrX11PFVC9RU+iK/y3l4t+1LoTyuqnzISWFlBA0rMLIxQ8Rq7ay9k6a1NbuQEJCAk6fPo2goCDU1dUhLi4OdnZ2nWyTlI//uVTgTD1q1mdxSpUZM2YAAOLj49GzZ0/cvXsXd+7cMegaujB2EczY6+bl5WHLli0AgE2bNun1nlo7XC3oyGQytLS0oLm5WXGk/f7778PGxgYikQienp7w9vZGYWEhJ3UzDIPKykoMHz68w/VLS0sVt1E3XwnA6PlKrq+nipBmU60dIS2eWQpqSIlugyXmOYWKvj6eysf/ISEhWLhwodHH/8rw1ehqo7GxEY6OjoiIiEBdXR3+9re/cb7UxOcimK7rdhdvVq6aIAcHB9ja2uLMmTMYOnQoXnrpJaxatarDvwk7OzvOQh3YBpiNR2av39zcrPia6/lKPuc1hTabqow5lEauoeaeGlKiG2GJeU6hEhAQgNOnT2PXrl24d++eRh/PSZMmYdKkSZw/Pl+NrjZef/11uLm5wdHREfn5+WhtbeXcp5KvRTB9rqvve2rNcNkEiUQiNDc3o6ioCEFBQYiNjUV7e3sHCyK5XI6ePXtyUruDgwMkEkmHBlQul3doUFXher6Sq+uZYzbVWKxRaRRyc29OqCElCCU0pTl1NfTx8eQTvhpdbUyfPh3p6emKecvy8nJkZGTg8ccfx7Bhw/Dj5iGfAAAgAElEQVT8889zMnPJxyKYPte19HvKN3w0QWPGjMG1a9fw+++/KxpFW1tbpKen4/79+ygpKcGoUaNMfhzgQQPs7u6OoqIiMAyD8vJylJSUdHCCUIVrdY+r6wnZS9TalEYhN/fmxrpN+AiCYzSlOXUl9PXx7GrMmzcPW7ZswbZt22BnZ4fMzEw0NTWhvr4eZ86cQWxsLM6cOWPy4yj7wC5btsxoH1hDrtsd3lO2CVKO1CwvL8enn35q9DWjo6Oxe/duTJ48Gc899xwCAwPR2toKOzs7zJkzB3l5ecjOzubMn3TatGnIzMxEeHg4IiMjYWNjw7svMR8I1UtUWWlUDUYRKnz8u7ZWSCElCCU0pTl1pVlTfX08uyrsgpBEIoGrqytOnTqFuXPnorq6GmfPnu0Uc2oofM3Hartud3hP+VjQEYlEePbZZ/Hss88CAOLi4pCVlYX8/Hzk5eVh4sSJqKio4Mz+KSQkBPb29jh58iR8fX2xceNGqzyeFaKXqLUqjXwvnlkT1JCaSHp6OpKTk1FVVQWpVIrZs2dj9OjRli5LkFjLcfjly5dx9uxZ3Lp1yyxpTubGFB/PrsCVK1dw8+ZNAEBdXR3mzZuH7Oxs2NjYcDJzydd8rLbrdof31BxNEHukvWTJEnh5eXWwZzp48KDJ9k+qDTAARU69NSMEL1EhjxFoQ4jNvaWghtRE4uPjIRaL4e3tjYKCAqxevRrx8fEICgqydGmCgz0Od3V1RUlJCdatW4ePPvpIcOqjudOcLMHGjRsVPp5OTk6IiIjArFmzLF2WWWhra4OdnR1kMhmamppw/fp1tLS0wNXVFQ8//DBqa2tNuj5f87G6rtvd3lO+miBN9kxc2T91RYSwyd5VlEYhNPeWgozxTSQrKwuDBg2CWCxGdXU1FixYgHHjxmHt2rUaby8EU1pLwx6HT5s2TS/VQdvrxpdKzaY5PfbYY7ylOfGtGmdlZaGkpMQqlGlzUlRUhKlTp0Iul2PMmDEoLCxERUUFQkJC8Morr9DPqBFYy+82dfGdyvGgTU1NePnllzFx4kSsXLkSwAPF1N7enpeZXGt53YSGrtetOyuN2hDKvzd1xvi01GQigwcPVvjWlZaWoqmpCR4eHhauSrhcvnwZO3fuRHR0NGfH4fHx8cjKyoJEIlGo1FeuXDHqWjKZTPHnPn36QCqVQi6Xm1yjJrheomptbcUXX3yBFStWYO3atSguLu4Wi1qG4u3tjYceeggvvvii4gNRnz59utTMJaGe5ORkbN68GW1tbYr4zvLycsX3NdkzceGUQJgPPz8/zm3dCH6hI3sNGKq6VVdXIyYmBh4eHliwYIEZK9WNkOZc9TkOV6caalsmiImJ6aRSHz9+3KixCXOnOelaojI0Fz02NlYRL5mbm4uYmBgcPXpUEVtpzkUtY+JJzcXGjRtRUFCAa9eu4ciRI7C3t4e7uzvGjh1r6dIInmHz67dv3652PlSTPRNX9k+EeRDCGAFhGKSQasAQ1a2mpgYRERFoaGhAXFyc4OwmuFQQTSUsLAxJSUn45ptvYGNjo/Y4RZ2ixy6hqINLlTo0NBRSqVShjgwYMADffvstVq5ciXPnzhl1TV1oU41jY2Nx5MgRSCQS5ObmYtmyZaipqVF7HeV4yc2bN2Pr1q1obm7GoUOHeFGmdZGQkIDvvvsOEokE9fX1iIuL48RWiQuCg4MxceJE+Pr6ws/PD1OmTEFkZKTJG/aEsGHnQ/v166d1PlSdPdPcuXMtVDVBdA9IIdWAvqpbbW0tIiMjUVlZiYSEBAwYMMBCFWuGSwXRFGQyGRwcHABoPw5XpxpevHgRM2fO1Hp9Y1Rqdeoxm+a0bt06lJeXw9HRkdclLE2qsaG56OriJaVSKfLy8tDW1mb2RS0hR1lawpifsDya4jtVRzXU2TOZavlEEIR2qCHVgPLQrzbVbe3atcjNzYW/vz/27t0LAAgKCsJLL71k0OPxeayu73PhG0OOw1nrpRMnTiAzMxN2dnZYvnw52tvbER8fjx49enS4vbJKnZiYqLdKrc0lwVyepGFhYQgLC1MsUe3evRvr1683OBddXbxkdXU1GhsbNT4Gn+gbZSnko32ia6FpPlQ1HlSdPRPRGWvMjCeECzWkOtClurm7u2PYsGEAgPr6+g7/bwjmsI+y9JxraGgoLly4gObmZvTv3x/vvPOOxuaOVQ1zcnLQ2tqKnj17KppM9niexRSVWpd6zLcnqSbVmP2AUlBQgOzsbDAMg+rqap256Krxkvb29rCzs1N83xyLWiz6RlkmJCTg9OnTCAoKQl1dHeLi4mBnZycIJZXoWtB8KHdYY2Y8IWyoIdWCLtWN3VS2sbExWdXk+1jdWAWRS0JDQxXH4bpgFb333nsP//73v+Hs7IxNmzZBJOrkFGGSSq1LPebbk1STasx+QBkzZgz++OMPfPbZZxg5cqTWXPTW1lYcP34cNjY2GDlyJMaOHYt//vOfuHDhAt5++22zLWoBHaMsExMTUV1djTfffBM7duzAhx9+2OG2Qj7a1wSputbLtGnTsG3bNoSHh6OyspLmQ43E0pnxRUVF2Lp1K6mzXQhqSDWgj+pmiKrJKl55eXnw8vLq1LzyeazOx5wrnyMGyqqhk5MT2trakJKSgtDQUDzxxBOIiIjo0JhyoVJrUo9NOerWp2nRpBr36tWr0wcUHx8fZGRkaMxFj42NxbfffgtXV1fIZDLs27cPo0ePxksvvYTLly/rpUxzhSFRlvoe7QsJUnX5RZdXqCnQfKjpKGfGp6WlGRx/aupRf3t7Oz755BPcv3+f1NkuBDWkGtBHdTNE1WSbV6lUqrV55eNYnY85159++gk2NjZwdnZGc3MzUlNTsWvXLk4UXWXV8PLly3B1dcWsWbMgl8vx/fffw8fHp4PSumHDBpMeT5N6rO8Slib0aVo0qcbsB5T169fjzp07uHXrFvLz8zF69Gi1cZDsAtT48ePh6emJmpoanDt3DsOHD8fLL7+Ml19+GQCQlJSEPXv2KO6naSbXVAyJstT3aF9IWKOqa00kJydj27ZtCAwMVHiFcpElD9B8qKmYmhnPxVH//v37UVxcLMglYsJ4qCHVgD6qmyGqJtu85uTkwNPTU23zytexurbnYojSqawIt7S0QCaTYcyYMWhsbMS5c+fw5ZdfYufOnSbXq6wajhs3DrNnz4aTkxMGDRqEuXPn4uLFi3of/etCm3psqicpF03LhAkTkJycDDs7O7z22mt444031OaiswtQgwcPxpo1a9DY2Ig5c+agrKysw+1u376NgoKCDg2f6kwuV+gTZWnI0b6xGOrlqg/WqOpaE7q8QgnLYWpmvL5H/ZpUVFadnT59Ou7evWuwOksIF2pINWCI6qaPqqmreeXTPkrbczFk7EBZEZ4zZw7Wr1+PgIAATJ06Fc8//zyKioo4qVdZNWxsbISjoyOysrJQXV0NmUzWYUnHVLSpx/osYWlr6E1tWmpqavDtt9/C398fiYmJWv9NqNuwr6iogJubW6fbSqVSrFmzBs7OzmpncrnC0dERy5cv13obQ472DYVtRPft24eysjJMnjwZZWVlWLZsGQ4cOKAICzAGa1R1rQXKkhc2pmTG63vUr0lFVVZnn3vuOSQmJnLzpAhBQA2piRiqatbW1iIhIaFT88rVsbqhGDJ2oNxUOzk5QSaTQSqVIiYmBmKxmBez9ddffx1ubm6Qy+Wora1V5ExzhTb1WJ8lLG0NvSlNizEfUFQ37B0cHBQjB8qUlZVh5syZcHd3VzuTa04MOdo3lNjYWPz++++oqqqCo6MjioqKkJiYiKVLl2r0ctUHc6i63RWGYXDs2DFcv34d1dXVyM7ORkBAgFqvUMIyBAcHIzg4WPG1vpnxhhz1a1JRldXZzz//3GB1lhA21JCagKFNQ01NDf75z3+itbW1U/PKlX2UoRizTMUqwi4uLjh//jwyMjIwfPhwLF68mPP6pk+fjvT0dDQ2NmLo0KFYsGABhgwZwtn1VdVjVvGMiIjQa1lLU0M/cuRIk5oWYz6g9O3bF9u3bwcA/Pnnn4iKisKIESM63GbEiBHo06cPfHx8cObMGbUzueZGn6N9Q2Fnah977DHcvHkTDz/8MNLS0nDixAmtXq76wKeq291JTk5GYmIixGIxqqqqFLOj6rxCCWHg5+en1+30PerXpqIqq7OlpaVobW0FoJ86SwgfakhNwJCmgW1ea2pq8Mknn3RqXk1dzDEVfZepWEW4uroa9vb2uHLlCgYOHIjt27fzYiU1b948zJs3D1lZWR2aZ74w1A9WU0Ovq2nRtYFvzAeU9evXo7KyEnZ2drhx4wYGDRqEv/71rx1uM2PGDMWfp06dyvlMrqGkpqYiJSUFDQ0NkEqlCAkJwYQJE0y+LjtT6+zsDC8vL2RkZKC2thaHDx8GAK1errrgU9Xt7qSkpOChhx7CkCFDIJfLUVJSgs8//5y8QgWMvlvy+hz161JRldXZrKwsfPzxx3qps4R1QA2pCRjSNLDNa69evcx6JK8P+o4dKCvCPXv2xNmzZ2Fra4uBAwfis88+E8zzMQVj/WBVG3pdTYuuDXxjPqAEBwfj2LFjkMvlCAkJwcKFCzvN9bIzuWzNXM/kGsqpU6dQXV0NV1fXDvGsjzzyiEk+n8oztZMnT8aVK1dQWFgIT09PxaKaKRii6vLtWZqUlITU1FTF13w5J/CN8uxoYGAgtm3bhqqqKiQlJaFv377kFWrl6HPUb+jClL7qLGEdUENqAoY0DWzzWltba9YjeV0YMnagrAinpqaiqakJzs7Oik+4NTU1Vt+QGjPCoKmh19a0GLKBr6+KqE8+OzuT6+joiPz8fM5ncnWhrnnavHkzevTo0SGeNSUlxWSfT3am9qeffsLQoUPRo0cP+Pj4IDc3V6OXq77os7DFwrdnqTmdE/hEOWee9Qpdu3Yt7OzssH37dvIKtVI0bcurayYNXZgiQ/yuBTWkZoJtXs119KwvhowdKCvC3t7ekMlk8PDwUMx0chlzqg4+zfhV0XeEQVtDr61pMWQDX5OKaIy5PTuTK5fLeZnJ1YW65unatWu4cuVKh3jWHTt2mGyZxc7Url+/Hrdu3UJubi5qamoQGBho1uN1c3iWmss5gU+Uc+ZZr9CkpCT07t2bM1N8wrxo8xxV10wauzBFdA2oIe3mGDJ2YOk5V0PnO43FEOcEY90RDNnA/+CDDxR/VlYRjWlI2ZlcS6LaPH3yySed4lm58PlkZ2orKiqQnp6OHj16YNGiRXj11VfVernyhTk8S4XknGAslDPf9TA1XpSO5LsX1JB2cyzdZBqCsfOd+pKamopjx47h559/RktLCzZs2KDTOcGY5SNjbIMuX76Ms2fPdlARrRV1zZNqPOtf/vIXk30+2ZlaT09PrFixAgsXLlTMz5oTQz58GDMPypVzAp9xnfpCOfNdB1PjRQE6ku9uUENKWA3GzHcawqlTp3DmzBk0NDTAzs4Oa9euxU8//YSnn35ao+KpT0OvutTyt7/9zWDboPPnz3dSEbnGHMsxqs1TcnKyonli41mbm5s58fnUZ6aWbwz98GHMPChXzgl8xnXqC+XMdw1MjRcluifUkBJWh77znYbywQcfwMbGBuXl5Whubsavv/6KO3fumLx8prrUsnnzZnh7extkGxQWFtZJRVy/fr1JdalijuUY1eZp6NCh+Oijj3DhwgVFPGtERAS2bt3aJXw+jfEsNXQelCvnBCHEdVLOfNfA1HhRontCDSlhVRiajGVojvnMmTMVR+P9+vVDYmJiJ3N5Q1FeamloaMCTTz6J1tZWODo64s6dOxgwYIBW2yCZTKZIXGJVRLlcblJNmuByOUad4rphwwb07t0bwIPmqVevXopFFuV41uTk5C7h82mMZ6mh86CGOCdoOpanuE6CS0yJFyW6L9SQElaDMXGasbGx+OOPPzBy5Ejk5ubqzDHn42hceanl2LFjKCoqwuTJk+Hq6opbt25h2bJlWjeuFy1apPDOZFXEFStWmFyXOrhcjlGnuC5btgyenp6K5snFxQVbt27FI4880uG+fKQ3WQpDnosx86CGOCdoOpZ3cnJSWC6xUFwnYSyW3pbXZDVFCBtqSAlO4CtxRxlDN9rZ+Eh/f384OjrC0dERaWlp2LJli8ZZRD6OxpWXWrKysuDo6IitW7fC3d1dLwug0NBQXLhwoZOKyDV8xIqqKq7/+te/9GqeDPH5FDqGPBdj5kENcU7QdCz/9ttvK5RqForrJLjCnNvy2qymCGFDDSnBCVx6ZWrC0I12Nj7y0qVLaGhogKenJ9ra2nDkyBG88MILnbbz+TgaV11q+eCDD7Bv3z689tprGD16tF4WQKGhoWaJ9uQjVlSd4sql7ZShIxlCh88kLW3H8mS5RPCJOVVKU62mCMtBDSnBCcpemb/++iveeust/OMf/8CYMWM4M7A31KKKjY+UyWSYOnUqrl27ht69e6OqqkqtXZSuo3FVY/4RI0YgMzNTq1G/6lLLlClT8NVXXyEnJ8doOyO+4LoZ4kNxVcXQkQxA2E0sn0layklILMrH8mS5RFg7XFhNEZbD+vLlCMFy+fJl7Ny5E8uWLUN9fT369++vMLC/cuWKRWqKjo7GkCFDkJSUhLKyMojFYrS3t6u1iwoNDVXYDvXv3x8JCQkdxg7i4+ORlZUFiUSieF5paWkdvlZ9nspLLe+99x6WL1+usJQ6dOgQXFxcsGPHDt5fB314/fXXERYWhnfffRdvvvmmyc3QjBkz8MYbb2DatGmIi4tD7969cfHiRc7qZUcyxowZg82bN2Pr1q1oamrCoUOHtN4vNjYWR44cgUQiUTSxNTU1nNVlCtOnT1fMcw4dOhQ7duzoNF9rLMpJSCxyuRxSqRTAA8ulqKgo2NjYwNfXl+I6CatC1WqKsD5IIe1m8Bm/yS4Eubi4wNfXF/Hx8bC3t+fcwN4Q2PhIAPjll1/w6quvYsCAAWrtonQdjasa84eGhmL8+PFYt26dVqN+dqklOzsbIpEIY8eOVRxbC8nOiOtYUT6Pn4H/G8lgH8PZ2RlOTk7Iy8vTeh+2iY2NjUVZWRnmzp2LQ4cOYenSpZzVZix8JmnpOpYnyyXCmiGrKeuHGtJuBp/xm6oLQe+//z4kEglu3ryJ1tZWnDt3jvNFJ12w8ZEAcPz4cdjb2+OLL77A5cuXDV7CUjXmB6BQkLQZ9Ssvtbz33nv473//i5UrV5rFzqi1tRVffPGFXsfTXDdDfB4/A/83knHp0iXs378fV69eRUVFBRobGzXex5gmtitBx/JEV4WspqwfOrLvZsTExGD//v346KOPsGvXLtjb2+P48eMmX1cmkyn+zC4E3b59G7/99hscHR3h7u6OdevWmf2XQ3BwMGxsbPDbb7+hZ8+e+O677zBkyBDFEpajoyNKS0sNqk3VmN8Qo/6NGzdi+vTpKC0txY0bN+Di4oLLly/j0qVLXDzdTnz22WcWO57m8/iZJTo6Gj4+Pjh8+DDKysrg4OCgOIJWh2oTGx0drbOJ7UoI9VieYRicOHECkZGRWLVqFbKzsy1dEmFlBAcH48CBA/j666/x9ddfw9vbG15eXvjss88sXRqhJ6SQdjP4it9UXQi6d+8eXFxc4O7ujsTERLi6umLevHlITU3lxbJIE5MmTUJSUhJ69uwJf39/HDx4EAcPHuxgF1VZWal3barG/G1tbRqN+jUtzyxfvhxz5syBj4+PYsuZS6WaNaRvb2/HqVOn4OHhgXXr1qGpqcmsx9N8Hj+zKI9k/Pnnn4iKisL48eO13ic6OhpxcXE4fPgw3N3ddTaxXQmhHsur80dduHAhzp8/38HAnyD0xZxWUwQ3UEPaTeE6flPZK7NPnz6ora1FW1sbXn31VRw/fhy3bt2CTCbDk08+yUH1hqHJLury5cuKVCZ9alM15vfw8EBERIRGo35tG+Cq86hcztmyhvRDhgyBWCyGo6MjxGKxxuNpc2TY8wU7kmFnZ4cbN25g0KBBOkcgjGliCX5R9UedNm0aNm7ciKeeeqqDgb8Q1FzCOiBDfOuDGtJuiKHxm/qgvBAUHh6O6upq+Pv74/PPP0dhYSHEYjH69u3LSfKRoWiyi/rkk08MSmVSNeb/9ddf0dDQgFGjRnUy6te1PMOXUs0ilUoRHR2N4uJiNDU14ejRoxpnLM2RYa8MlyEKwcHBOHbsGORyOUJCQrBw4UJIJBKt9zGmiSX4Q50/qkwmg7OzcycD//DwcEuXSxAET1BD2s0wJn7TUJQVSWdnZwwcOBB+fn5ITU3lJPmIKwxNZVJVWsViMfr06QNnZ+dORv36Ls9wrVSzsIb0wINjWl3H0/pk2HPl38lliMKkSZMwadIkg+5jTBNLPGgcU1JScPLkSU6P0VX9URmGQWtrK+zt7TsZ+BME0XWhhrSbYWj8pjGwiqRy8lFzczPS0tJMTj7iCmNSmQwx5tdnA5wPpRroaEh/9OhR5OTkYNGiRejfv7/G42l9MuyNMaFXh3KIgiHzu1xhTBNLqJ/z5OIYXdUfVSaToa2tTaOBP0EQXRNqSLsZhsZvmoKu5CNLYo7atC3PmKpUa1MrlSNAT5w4gXv37uHjjz+Gi4uL2uNpfRKVuPbvNHR+l7A8qnOeXB2jq/qj1tXVQS6XK04XgAcG/j179jT1KRAEIWCoIe1mGBq/aQrKi079+/fHO++8Y9YNe22YozZtyzOmKtXa1EplQ/qRI0fi9OnTEIlEGo+n9cmw59q/kw1R0Hd+l7As6uY8uTxGV/VHtbOzg7u7u1oDf4IguibUkBK8oSv5yJKYozZtyzOmKNW61EplQ/qbN2/Cx8cHW7du1egBqk+ikjEm9NowdH6XsCyqc56AYcfouuZPQ0JCYG9vj5MnT8LX1xeTJk3C4cOHycCfsDh3795FfHw8fH19aXOfZ6ghJQie0LY8Y4pSrUutVI4AHThwIN5++20MGTJEY2ysvolKXPl3GjO/S1gW1TlPwLBjdF3zp6r+qAzDwM/PT9Ggbty4kSyfCLPT3t6ODz74ADk5OWhvb7d0OV0eakgJgif4Wp7RpVYqG9JnZWUpLKY0xcbqm2HPlX+nkGeLCfWoznkaeoxu6PypJQz8+XIRIKyX/fv3Iy8vDz4+PpYupVtADSnBK5pUOWtDaM/DGLVSkxn/2rVr9UpU4sq/U8izxYRmVOc89T1G53v+lCv4chEgrJOioiIcOHAAc+fORVpaGhiGsXRJXR5qSAle0aTKcZFIZE7M+Tz0MY43Rq001YyfK/9OIc8Wa4JLM39rRXXOU99jdFPnT43BGLWTLxcBwvpgGAYffvghfHx8sGjRIqSlpVm6pG4BNaQEr/AZkWlOzPk8tBnHs0rtqVOn0NbWhiFDhqCsrMwgtdJYM/7u7N/JpZm/JSgoKMCXX36JyspKuLq6IiIiwmDlz9hjdFPnT43BULXTWlRcwjycOnUKV69exahRo7Bp0yaUl5eDYRh8+umneOuttyxdXpeFGlKCV/iOyDQX5nwe2ozjWaXW398f169fx7lz5/DSSy/h/fff10ut5MuMv6tjaTN/U8jMzERkZCRcXFzg5+eHjIwM5Obmmu0o2tT5U2MwVO20hIpLCBeRSISBAweivr4eWVlZaGlpAfBgdIvgD4s3pCKRaAuAGQDkAHIAvMowTLVlqyK4hq+ITHNjruehyThenVLr4ODQwURcE+aIjVWGq6hRocClmb+pCzSG3H/Pnj1wdXXFl19+CScnJ8Xfq6qmjz76KM6fP8/LQo+x86fGYIzaaQkVlxAuwcHBCA4OVnz91ltvgWEY7N6924JVdX3Eli4AwCkAwxiGGQ7gNoDVFq6H4BhlVS4uLs5qVTlzPg/WOP7GjRsdjOMHDx4MsfjBj62hSi1rxu/h4YG9e/di1apVOHz4MG/PITY2FkeOHIFEIlGY99fU1PD2eHyj6T1RJjU1FatXr0Z4eDhWrlyJc+fOqb1WcnIyNm/ejLa2NsWRcnl5ud616Ht/hmGQn5+PkpISzJ8/Hy+88AJiY2Nx48YNLFmyBDdv3oSDgwPOnDmDhIQEo+vRRUhICKKiomBjYwNfX19s376dN4XWGLVTVcW9f/8+SkpKaLuaAAD4+fnB39/f0mV0eSzekDIMc5JhmNb//fI8APoNYALp6enYsGEDIiIisGrVKly6dMmi9Sirclu2bFGrygmtZnXo8zy4JCwsDElJSfjmm29gY2PT6ZO5MUota8bv7OyM+vp6xf/4QNm8f/Pmzdi6dSuamppw6NAhXh7PHOh6T4D/mzV1dHREaWkp1q1bp/aYT/lIOTExEW1tbTh48KDeteh7/9bWVjQ3N4NhGEyZMgUTJ07E6dOn8d5778HOzg4BAQGQyWSQy+V45JFHjK5HF+z8aWJiIjZt2sSrnZImtVOXC8W0adOQmZmJ8PBwREZGkhk/oWDVqlVkim8GLH5kr8JrAPiTbLoBQttq1yciU2g1q8PUqE9A/yNsXcbxxs6BajLjV61rxIgRuHz5skkb5VxHjVoafc389Zk1NXWBxpD7SyQS2NvbIzAwEMuXLwcA3LhxA7///jvq6+tx/fp1SKVSlJeXIygoqEss9Bg7s2qsiwBBENxgloZUJBL9DEBdWPUahmGO/e9t1gBoBfAvbdfKysrivkAzw+dzeO211+Dr6wuxWIy6ujpERUVh//79Fj0m9/X1RXt7O4qLiwEArq6uHV4DfWu29Huv63noYteuXbh06RIeeeQR3LlzB6+++io++uijTs/znXfegZubGxwcHHD//n2UlZVh9uzZyMrKwqVLlxAXF4f6+nqMGTMG6enpaG1t1fCID9BVo2pdR44cwYgRI+Du7o7CwkK89957iIqKwsMPP6z3cwUAJycn/Pbbb0hISMDNmzdRXFwMNzc3i7+P+qBao7b3RJWMjAxcuXIFd+7cQXV1NQYMGDoMauIAACAASURBVNDhdjKZDDU1Nairq8OePXvw+++/48qVKxg0aJBerw17f3bhAgCam5tx7949tfeXSCQoLy/H7du3FQ1aXV0dxGIxXn75ZbS0tOBf//oXCgsL9bqevq9bSUkJvvvuO9TU1MDZ2RkLFy6Em5ubQdczlpEjR2L//v145ZVXUFNTA7lcjvHjx+t8PoMHD1YsMDIMY7Z/q9bwMyFE6HUzDku9bsrLweowS0PKMMxT2r4vEokWAZgOYAqjw31W1xMSOsrJOXygfO1bt24p/s5SrxvrlakNfWrm+3XThT7PQxvsbN5f/vKXDvnzFy5cwNKlSzvc9pVXXlEYxz/yyCNYv369QmF77rnnUFtbCw8PD9y8eROrVq3Ca6+9hpUrV6p9XF2vG1tXYGAg+vfvD+BBQzVlyhQsXbpUofLl5eVh5syZBj3nLVu2IC4uDmfOnIG7uztcXV3h5eUl+J9hda+ZtvdElVOnTiEjIwP379+Hm5sbxo4diz59+ii+zzAMXF1dUVxcjLS0NAQGBqK5uRk3b96Em5ubTlWOvb+zs7OiTnt7e/Tu3Vvta7tgwQLExcVhx44daGtrQ21tLSQSCWxsbJCRkaGYSa6pqdHrevq8bpmZmdi0aZNisz8nJwcikchs731AQAD8/f1x8uRJ9OvXD6+//rpgU5cs/btNiOiTH0+vm3EI+XWz+JG9SCR6BkAUgCcZhmm0dD1dBWvcarfGmvXFkCNsbcbxf/vb3xSZynK5HL/++qtJps1sXXl5ebh37x5aWlrQ2tqKCxcuoKWlxaSNcq6iRoWAIWb+YWFhCAsLQ35+PpYtW4bdu3dj/fr1iu+zR8p//vknxo0bh3Xr1uH69euoqKjQy4jd0CPpqVOnws7ODt9//z2kUqli6Uomk2HKlCmQyWRITU1FaWkpZ7ZMmjb7zYUlokcJbqD8+O6LxRtSADsB2AM4JRKJAOA8wzBvWrYk68YavSatsWZD0JU/ry/KSu2tW7dw584dTJkyxeS6SktLMXPmTOzZswctLS3Iz89HXV0d7t+/r3GjXBdcRY1aE/rOmj7zzDNISUlBRkYGVqxYAalUikcffVTvuU1DbZQmT56MyZMnK77u168f8vLykJmZiba2NtjZ2aG5uZkTWyZ2s7+0tBTz58+HWCzGqFGjsHLlStjamvc/OZRPb31Qfnz3RQhb9gEMw/RnGGbk//6PmlETMPc2OBdYY83GEB0dDR8fHxw+fBhlZWV65c9rgks1OTo6Gr6+vjhy5AgaGxshFosxevRonRvluggODoaDgwNaW1sREhKCnTt3GhU1ak0sWrQIb7/9NqKiovDGG2+goqIC06dP73S7Z555Br6+vrC1tVXYIPXo0UNvI3ZTbZQeeughPProo7CxsYGTkxMeffRRjBs3jhNbJk2b/V999ZVR1zMFU+21CPOinB/f1UQJQjdCUEgJDuFiG9zcWGPNxsDVETbXarJyXYsXL8aPP/6oqEubyqeL7hg1Ghoaqpg17d+/P9555x21s6ZSqRTe3t4YPnw4oqOjARhmxG7qkfSsWbMQFxeHtrY2yOVytLS04K233jJJbWfRtNl//fp1k69tKJRPbz1QfjxBDWkXg/WaBKDwmOTLa5IrrLFmY+DiCJuPtCXluv744w/I5XKcOnUKZ8+eRWlpKSoqKrBixQqTH6c7oO+sqSXiNJVRnStdu3YtJ80oi4eHh0IlZRgGcrncIsf11ppPr89ST1eD8uMJaki7GJq8JoWMNdZsDMHBwTh27BjkcjlCQkKwcOFCg4+w+VCTlesKCAiAm5sbnJycdKp8hGmYM05THapzpVzCKrDh4eFoa2tDUVERXn31VcX3VWNLIyIiOPf8tNZ8emte6jGlkab8eIIaUoIwE1wcYfOhJk+aNAk9evTA/v37FS4AABAYGIjFixebdG1CM13ZiF2bApuZmYnIyEiFJVRGRgZyc3M5f+7Wmk9vrUs9pjbSlB9PUENKEFYEX2pyQ0MDLl++jLq6Otja2uLevXvo27cvL49lDeibqmUKXd2aSJMCay5LKEuPRRiD8lJPWloadNhyCwquG2k/Pz9OrkNYDxbfsicIwvKcOnUKtra2mDx5MgYOHIjKysoOR6zdjdjYWBw5cgQSiQS5ublYtmwZampqLF2W1cNaQpWUlGD+/Pl44YUXEBsbqzNtzFisKZ9edanHmuBjO57y47sf1JASRDenra0N165dw5gxY7B582Zs3boVTU1NOHTokKVLswimvh4Mw+DEiROIjIzEqlWrkJ2dzXPF1oO5LaFMtccyJ+xSj5OTk2Kpp7y8HJ9++qmlS9OKNTfShLCgI3uC6OYYkiLVHWhvbzfp9UhOTsa2bdsQGBio8L7ct2+fYBshc2JuSyhrGouw1qUe2o4nuIIaUoLo5nCVItVVkEgkJr0eQva+FEJykRAsoYSItS71WGsjTQgPOrInCILTFKmugLGvB+t92a9fP0F6XwohuWjWrFnIyclBeHg4li9fjqKiIqtQMM2Nn58f/P39LV2GToKDg3HgwAF8/fXX+Prrr+Ht7Q0vLy989tlnli6NsDLoYylBEJylSAEPrHX27t2LzMxM2Nra4qmnnsLUqVO5LJd3jH09hO59KQT1lm9T/q6CtS700HY8YSzUkBIEwUmKFEtCQgJOnz6NoKAg1NXVIS4uDnZ2dryZsPOBsa+Hsd6X5jhKF1JyEZ+m/IRlsdZGmrA8dGRPEASCg4Ph4OCA1tZWhISEYOfOnQanSLHk5OTgoYcewubNm7F9+3a4urri7NmzHFfML8a+Hqrel/fv30dJSYlOb0ZzHKULXb0lCKJ7QwopQRCcpEixBAQE4PTp09i1axfu3buHyspKPP7445xc21yY8noYEwlqjqN0PpKLlJVdmUyGd9991+xLUgRBdA1IISUIglPGjRuHiooKnDhxAr/99hskEgkefvhhS5dlNgz1vlRdhGJve/DgQU59TFn1trCwEMePH8fSpUtx/vx5ODg4GH1NZWW3pKTEIktSBEF0DaghJQiCMxiGwRdffIGxY8fi6NGjOHToEFxcXLBjxw5Ll2Y2WO/LxMREbNq0SadiqHqUnpycjNu3b6OlpYXz4/tp06bhwoULePvtt3H27FnI5XKcPXvW6OsrK7vvv/8+2tracPDgQU5qJQiie0ENKdGlSU9Px4YNGxAREYFVq1bh0qVLli6pS8P6Snp4eMDe3h69e/dGjx49aE5RC6pH6SkpKXB2dsaUKVOQmJjIWZPHMIxiZrS1tRWPP/44Dh06BBsbG53XLygowIYNGxAeHo5169bh/v37OH78OP744w/cvn0bOTk5cHd3F5TFFUEQ1gU1pESXJj4+HllZWZBIJCgoKMDq1atx5coVS5fVZRGLxRgwYAAuXryIqKgoLFu2DAUFBRg7dqylSxMsyotQ7e3tKCkpQVtbG3x8fDjdhE9OTsaWLVtgY2MDT09P5OfnY+DAgTqvn5mZiSVLluDmzZtwcHBARkYGvvnmG8THx6OtrQ319fUIDw9HVVUVLUkRBGE0tNREdGliYmIwaNAgiMViVFdXY8GCBTh+/DiCgoIsXVqXZePGjdi7dy9ycnLg5OSEiIgIzJo1y9JlCRp2EWr58uXIyMiAo6OjYhGKqyYvJSUFgwYNgouLC0aOHIk///wTBw8e1Hn9PXv2wNXVFV9++SWcnJwAAEuWLMFDDz2E3r17IyAgAFeuXMEPP/yg15JUQUEBvvzyS1RWVsLV1RUREREUq0oQBDWkRNdm8ODBij+XlpaiqakJHh4eFqyo6+Po6KjIKSf0IyQkBPb29vjpp5/g6OiIp556StGkmboJD3T0IK2pqYGtra1CGdV2fYZhkJ+fj9LSUsyfPx9isRijRo1CeXk5Ro4cCQCoqqqCl5cX8vLycO/ePYwaNUpjHZmZmYiMjISLiwv8/PyQkZGB3NxcakgJgqCGlOgeVFdXIyYmBh4eHliwYIGlyyGIDrCLUM8++yyWLFmCxsZGMAyD8vJylJSUaG3y9EF5cYodD7Czs0NVVZXW67e2tipy56dMmYLm5mb88MMPqK2txbhx4xTKbk1NDZqamjBw4ECtFlfq1FaCIAiAGlKiG1BTU4OIiAg0NDQgMTERzs7Oli6JIDRijI+pLpQXp9jrV1VVAQD69euH3r17IzIyslNKlEQigb29PQIDAxWq940bN3D+/Hk0NzcrlN3Vq1ejR48eWi2uWLX17t27mDBhAlpbW9G3b18cOHAAXl5eJj0/giCsH1pqIro0tbW1iIyMRGVlJbZs2YIBAwZYuiSC0IqhPqb6oLw4NWvWLCxduhRNTU3o27cvZsyYgd27d2tMifLw8FCopO3t7ZDL5ZBKpSgqKgIAjBkzBl5eXpg2bZpWi6vW1lZUVlYiPz8fUqkU/fr1w+3bt7Fz506TnhtBEF0DUkiJLs3atWuRm5sLf39/7N27FwAQFBSEl156ycKVEYR6lI/vuYRVRiMiIlBZWYmAgADs27cP77//vtaUqJkzZ2L16tUYO3YsRCIRbG1tERISgl9++aWDijt9+nStjy+RSFBaWgo3NzecPn0aTk5OeO2111BXV9ch8UlVpSUIontACinRpXF3d8ewYcPg7OyM+vp6xf8IojtRUFCAq1evws3NDZcvX0avXr2wfft2eHh4dEiJUmcz1dTUBJFIBODBghXDMHjzzTc7qbhubm5aa2AYBm1tbWhoaMD8+fPx/PPP49q1axCLxR0Sn7gOAyAIwjoghZTo0mzYsMHSJRCERVHebB88eDDEYjHmz5+PgIAANDU1dUiJAv7PZopVLT/44AOFeX7Pnj0xf/58fPvttwgPD++g4mZlZWmto7W1FR4eHqiqqkJtbS1aWlpQXFwMsVjcIfFJnUpLEETXhxpSgugGZGZm4ujRoygrK4NIJMLHH39s6ZIIM6Fts101JQr4P5up5ORkbNu2DTKZDFKpFBEREdi3b5/RRv0SiQR9+/aFp6cn/Pz8IJFI0KNHD7S0tCgsqTSptARBdH2oISWskvT0dCQnJ6OqqgpSqRSzZ8/G6NGjLV2WYElOTsbFixfR3t4OW1v6se8uaPIRXblyJWxtbTssO6naTBlrpK8NDw8PyOVyfPzxx2AYBgsXLoRIJNKo0hIE0X2gGVLCKqFIUMOIiIhAUlIShg0bZulSCDOi6iM6ceJEnD59Gl999RWABw2rl5cXTp06hQkTJmDx4sWwsbHBnDlzUFlZCT8/P9jZ2XUy0pdKpUbVM2vWLOTk5CA8PBzLly9HUVERZs6cqValNfYxCIKwTkgqIawSigQ1DAcHB0uXQFgATT6i169fB/BAOU9NTcXw4cORk5OD27dvY9++fXB2djbKSF8XU6dOhZ2dHb7//ntIpVKsXbsWU6ZMweHDh9WqtARBdB+oISWsEooE5QeaNe16KPuIMgwDuVyuGNtgl4l2796tWCY6d+4c+vTpg7y8PFRUVMDHxwcFBQUKd4p+/fqZZNQ/efJkTJ48ucPf8REGQBCEdUENKWHVUCQot9Csaddj1qxZiIuLQ3h4ONra2lBUVIRXX321Q7698jLRf//7X6SkpEAul6O5uRlyuRzPPvssvvnmGwwaNEhh1F9QUIAvv/wSlZWVcHV1xYwZM4yukU18OnnyJHx9fbFx40bKtyeIbgb9F4ewWigSlHsiIiIgkUiwYcMG3Lp1y9LlEByg6Zhck+XT1atXMWDAAKxfvx67d+9Gv379kJGRoTDS79WrVwcrKT8/P1y6dAk5OTno1asXXF1dERERYVBDyVcYAEEQ1gM1pIRVohwJmpCQQJGgOrh69Sr279+PgoICyGQyREVFYciQIVi8eHGH29GsaddE+Zi8oKAAGzZsQEVFBXJzc/Hwww8rbtfc3IympiaUlJTg8OHDaG9vx9WrVzFhwoQOqqWylVRhYSEiIyNRW1sLHx8fZGRkIDc3lxROgiAMghpSwiqhSFDDkMlkqK+vh6enJwCgsbGREqusEFMjNlWVTblcjqysLMUyUXFxMWxtbRVb+c3NzThx4gQCAgIUj6NqJZWVlQU7Ozvs2bOHFpEIgjAaakgJq4SNBAWgaKyowdLMuHHjMG7cOEuXQZgIa1YfGBioiNhkj9G1wTayMTExaGpqwubNmxEYGIgJEyZ0WCaSSCTw8/ND37591W7lA52tpAoLCxVzqQEBAR18TgmCIPSFfmMQgiMpKQmpqamKr9vb27FkyZIOt6FIUKI7YmzEZnJyMhITE1FXV4e6ujpMnz4dw4cPx/jx4/GPf/wDv/zyi2KZ6OOPP9a4lQ90tJJaunQpfv75Z5SVlaFHjx6YOHEiTpw4gd69e+ONN97g++UgCKILQQ0pIThu376NgoKCDrNtYjFlOJgDfWdNCfOjaSten4jNlJQUDBkyBD179sT9+/dRV1cHe3t7nD59Gr1790ZiYqLitpq28pVhraRsbW1hZ2eHHj16YOjQofjHP/7RSVElCILQB2pICUEilUqxZs0aODs7QyQSISsry9IlmRVL+YHSrKlwkclkRkVsKjeytbW1CAoKQkNDA3r37o3y8vJOzaOmrXxllJvWrKwsNDQ04Mknn0R7e3snRZUgCEIf6LcGIUjKysowc+ZMuLu744knnuh2djCW8gOlWVPh4uDgoDZis2fPnlrvp9zIssqmRCJBY2OjxuZRnXm9MspN69ChQ3H79m38/PPPOH/+vFpFlSAIQhfUkBKCY8SIEejTpw98fHxw5swZfP/997C1tcWQIUMsXZrZID9QQhWRSKSI8TQkYlO5kWWVzcrKStjb28PJycno5lG5aT1z5gwOHDgAZ2dntYqqJlTN9Q31LyUIoutADSkhOJQTX6ZOnYq5c+d2u5k08gMl1GFMxKZyI/v000+jsbERK1euhJeXF6KiovRuHrUxefJk+Pj4dIj01YWqBRX5lxJE94YaUkJwNDY2wtHREcCDaFCZTAaJRGLhqgjC8hgbsanayCqnLlkKZXN9Jycni9VBEIQwoIaUEByvv/463Nzc4OjoiPz8fDQ1NXW7GVKCUIexEZtCy4pXNdcXi8U6/UtNDQUgCELYUENKCI7p06cjPT0dcrkcQ4cOxYIFCyASiSxdFtFNEXojpM8cptCy4lXN9dlEKG3+pcaGAhAEYR1QQ0oIjnnz5mHevHkd/q672T4J3Q/UUrZUlkDIjZC1zmEqm+trSoRSxdhQAIIgrANqSAlCgAjdD9RctlRCaHyF3AhZ8xwma0GlKRFKGVNCAQiCsA6oISUIASJ0P1Bz2VJZyo+VRciNkDFzmEJCn0QoFmNDAQiCsB6E/1uLIAjBYS5bKkv7sQq5ETJmDlNI6JMIxWJsKABBENYDNaQEQQgWS/uxCrkRYucwBw4ciPLyclRWVqK2thYXL160ioYU0J0IxWJsKABBENYDNaQEQRAaEHojZGtri99++w2NjY3w8/NDdXU1GhsbDbqGtaQlGRMKQBCE9UANKUEQhBaE3Ai1tLSgpaUF7u7uaGhogI+PDxYtWqT3/bnY0mcb2ry8PPTv35+3hlZoXqoEQXALNaQEQRiM0G2puESojRDDMBCJROjVqxdSU1MhFosxfvx4PPnkk3pfw9QtfeWG1tXVlVfbKaF5qRIEwS3UkBIEYTDmsqUSQuMr1EaIXWpydnbGa6+9plhq+uqrr/SaIeViS1+5oS0uLjYoy54gCEIZakgJgjAYc9lSCd2P1ZIYYy6vjKlb+qoNrUwmw6RJk6zGdoogCGFBvzUIghAsQvdjtTSGmMurom9Dq2npSbWhLS4uxunTp63GdoogCGFBDSlBEISVYoi5vDo0NbRsE3rnzh2kpaXh4YcfRkBAQIcZUdWGNisrC6WlpXortARBEMpQQ0oImvT0dCQnJyMvLw9eXl6YPXs2Ro8ebemyCIJ39LFjMsRcXh3qGtqnnnoKS5YsgYuLCwoKCiCXyxEZGYm//OUvne6v3NC2t7cbpNASBEEoI5jfHCKR6B8APgLgyTBMuaXrIYRBfHw8xGIxpFIpCgoKsHr1asTHxyMoKMjSpREEpyg3oG1tbcjMzISHh4dOOyZ9zeXVoa6h/fHHH+Hq6oo9e/bg9ddfh0QiwdatW7Ft27ZOS0/KDW1VVZXBCi1BEASLIBpSkUjUH8DTAPItXQshLGJiYjBo0CDk5OTA09MTCxYswPHjx6khJboUqn6gJ06cgI+PD/bu3WuUHZMhKDe0DMPg888/R2lpKebNm4dr165BIpHghRdeQEtLi2Lp6ZlnnlE0z76+vmhpaYGjo6PBCi1BEASLIBpSAFsBRAE4ZulCCGGhbCNTWlqKpqYmeHh4WLAiguAeZfskR0dH3L17V6cdE8MwSElJwcmTJ+Hg4IDFixcjICDApDqUF5WCg4NRVFSEqqoqSKVShIeH48aNG/jjjz9w9OhRRfNcVFSE5cuXo2fPnmT7RBCE0Vi8IRWJRLMAFDEMc1UkElm6HEKg1NbWIiEh4f+3d7exVdZpHsd/V5+Fap+gKHSgPsCuCBIRDTrZDQYjDqvTxBc66wKzqBiNUHd2Bh2VTTAqEt3srjrLi1laohmz66w6jhp21yGMSyTR0dVxgTLQqTXUbolgmVZiaXvaa1+0NEwfaM9pz/2/D/1+XtFzyunVf3ru/M71f7hVVlam1atXhy4HmDCDj0+SpM8++0wXXHDBWY9jeuONN/Tcc89p4cKFampqUnV1tV566aVxHUo/eKNSXV2d9uzZo3379g2sEW1oaNCcOXOGHKZfX1+f+iAAmPQiCaRmtkvShcM89ZikR9U3XT8m58JF71z4HaL09ddfa8uWLWpvb9cjjzyilpaW0CVlFP7ekhflmCUSCZ04cUKnTp3SokWL1NXVpQ8//FDnn3++VqxYIUl6//33tXfvXi1btmzg/73yyiu66KKLtGHDBp04cUIbN27U888/P+IHtpaWFr322mtqa2tTYWGh1qxZo5KSkiHfl5ubq+PHj+vw4cO6+uqr9dZbb2nPnj1as2aNGhoalJWVpcbGRt12223KysrS/Pnzdc899ygnJ4e/tRQxbqlh3FITatxGm0GJJJC6+43DPW5mCyVdLOl0d7RC0sdmdq27Hx3u/2T6lFB9fX3G/w5Ram9v15YtW9TW1qZt27Zp3rx5oUvKKPy9JS/EmJWUlGju3Lm6++67VVNTM9A1LS4uVllZmfLz81VWVjZQl7srkUjoyiuvHHhPXHLJJTp16tSwtR86dEhPP/30wDR7Q0ODzGzY7129erW2bt2qF154QT09PSovL9ell16qmTNnas2aNdq2bZtaW1t16623DnRv33vvPS1btoy/tRTwHk0N45aaOI9b0Cl7d98nqfz012b2uaQl7LLHaZs2bRrYXVxbWytJuuqqq3THHXcErgyZaCxHKYVQVlamY8eOad26dSoqKtLUqVN14sQJbdiwQaWlpUN2r586dUrd3d3Kz88feCwvL08dHR3Dvn4y96wfvPP+mWee+aONSjU1NcMepn9m9xYAkhV8DSlwNqWlpVqwYIHa29sHbhnJrSORisE72c92lNJ4pBJ6q6qq9MADDyg/P1+zZ8/WrFmzdN9996mpqUm5ublDdq8XFBQoNzdXnZ2dA491dXWpuLh4yGuncs/6sx0lNZ67QwHASGJ1FXH3ytA1IF42b94sKd7TDMgMyXQJU5Vq6L3ppptUWVmpxsZG7d27V9OnT1dHR4eeffbZgbA3OOhOmTJFzc3NcncdP35cLS0tWrx48ZDXHu896wcb792hAGA4sQqkAJAOqXQJU5Fq6E0kEiosLNSsWbN0++23DwmNwwXd6667Tm+//baqq6vV2tqq7Oxs3XnnnUNee6z3rB+rke4ONXijRLKd4rgupwAQDQIpgHPeRHcJhzOe0DtaaBwu6Lq75s+fr3feeUezZ8/W448/PmKAm+hp9tHuDpVspziq5RQA4otACuCcN9FdwuGMN/SOFBrPFnRXrlyplStXjvraUU+zJ9spjmI5BYB4I5ACmBTSvRlnvKF3pNA4Ed3dkabZ0yHZTnFUyykAxBvvdgCTQhRdwvGE3rOFxvEE3ajXZiYboKNYTgEg/gikACaFKLqE4w29I63NTDXohlibmWynOIrlFADij0AKYNIYbTPOeKUr9KYadEOtzUw2QHO2KQDe8QAwgdIRepMJuqen6I8cOaJdu3bJzLR06VJVVlZq6dKlkazNTDZAc7YpAAIpAGSAsQTd01P02dnZOnz4sL755htNmTJFBQUFuuyyy7R79+5I1mYm2ymOctMVgHgikALAOWL79u3Ky8vTV199pdzcXM2cOVNLlixRbW2tJOmuu+6KbG1msp3idC+nABBvBFIACGQid8C7u+rq6vTJJ5+ou7tbktTT06P29nY9+eSTeuihh1ibCSC2uDIBQAATvQM+kUiosbFR2dnZmjFjhjo6OtTd3a3u7m7t2LFD7777rnp6elibCSCWCKQAEMBE74DPyclRd3e3cnJy1N7erry8PE2fPl0VFRVqaGjQyZMn9dRTT7E2E0AsEUgBIGLpuDtRIpFQVlaWent7NWfOHHV1dam5uVnFxcW64oorNGPGDMIogNjKCl0AAEw2g+9OdP3112v37t3asWNHyq95ehNTdna2SkpKdPToUXV0dOjzzz9Xc3PzmO55DwCh0CEFgIil6+5El19+uQoLC1VZWamCggJ99NFHKi0t5RglALFHhxQAAjjz7kS9vb0TsgO+qqpKJ0+eVCKRUElJiSoqKvTEE08QRgHEHh1SAAhguLsT3XLLLdq8eXPKx0BxwDyATEUgBYAABofHtWvX6sUXXxz3MVAcMA8gExFIASBJE3Wg/ZnhcePGjRN6DBQAZBICKQAkYaIPtJfScwwUAGQSrnQAkISJPtBeGnoMVGdnp3bu3Kny8nKtW7duQn4GAMQZgRQAxihdncx0HQMFAJmCY1np/gAACOtJREFUQAoAY5TOTuaZx0C5+4QcAwUAmYKrHQCMUTo7mcMdA7V27dpxvy4AZAICKQAkIV2dzIk6Q3SiTgAAgCgRSAEgCcl2MpMJiOM9QzQdJwAAQBQIpACQhGQ6mVEHxHScAAAAUSCQAkCSxtrJjDIgcpYpgEzGVQoA0iDqgMhZpgAyGYEUANIg6oDIWaYAMhmBFADSIERA5CxTAJkqK3QBAHCuOjMg9vb2pj0gVlVVqaGhQdXV1Vq/fr2am5u1cuXKtP08AJgofHQGgDSJ+rD7iTrLFACiRiAFgDQJERDHe5YpAIRAIAWANCIgAsDoWEMKAACAoAikAAAACIpACgAAgKAIpAAAAAiKQAoAAICgCKQAAAAIikAKAACAoAikAAAACIpACgAAgKAIpAAAAAiKQAoAAICgCKQAAAAIikAKAACAoAikAAAACIpACgAAgKAIpAAAAAgqJ3QBAIA+TU1NqqmpUWtrq4qKivTggw9q2rRpocsCgLSjQwoAMXDo0CHde++9OnjwoAoKClRXV6fGxsbQZQFAJOiQAkAMbN++XUVFRaqpqdHUqVNDlwMAkSKQAkBg7q4jR47o6NGjWrVqlbKysrR48WI9/PDDysnhMg3g3MeVDgACSyQS6uzslLtr+fLl6uzs1M6dO1VeXq5169aFLg8A0o5ACgCB5ebmKj8/XwsXLtT69eslSQcOHND+/fsDVwYA0YjFpiYz22BmvzOzA2b2TOh6ACBqZWVlA13S3t5edXV1MV0PYNIIfrUzsxskVUla5O6dZlYeuiYAiFpVVZW2bt2q6upq9fT0qLm5WWvXrg1dFgBEIngglXS/pK3u3ilJ7v5l4HoAIHIrVqxQXl6e3nzzTZ133nnatGmTli9fHrosAIiEuXvYAsx+K+mXkm6WdErSj9z9wzO/p62tbaDI+vr6aAsEAADAuMydO3fg30VFRTb4+Ug6pGa2S9KFwzz1WH8NpZKWSrpG0s/N7BIfISmf+Qtlovr6+oz/HUJg3FLDuCWPMUsN45Yaxi01jFtq4jxukQRSd79xpOfM7H5Jr/cH0N+YWa+kaZKORVEbAAAAworDLvs3JN0gSWY2T1KepONBKwIAAEBk4rCpqVZSrZntl9Ql6fsjTdcDAADg3BM8kLp7l6RVoesAAABAGHGYsgcAAMAkRiAFAABAUARSAAAABEUgBQAAQFAEUgAAAARFIAUAAEBQBFIAAAAERSAFAABAUARSAAAABEUgBQAAQFAEUgAAAARFIAUAAEBQBFIAAAAERSAFAABAUARSAAAABGXuHrqGUbW1tcW/SAAAAIyqqKjIBj9GhxQAAABBEUgBAAAQVEZM2QMAAODcRYcUAAAAQRFIAzGzDWb2OzM7YGbPhK4nU5jZD83MzWxa6FoygZk92/939r9m9gszKw5dU5yZ2c1mdsjMfm9mPw5dTyYws2+Z2a/NrK7/evZg6JoyhZllm9knZvZ26FoyhZkVm9mr/de1g2Z2XeiaMoGZ/aD//bnfzP7VzApC1zQYgTQAM7tBUpWkRe5+haS/D1xSRjCzb0m6SdKR0LVkkF9JWuDuV0o6LOmRwPXElpllS/pnSd+RNF/SX5rZ/LBVZYSEpB+6+3xJSyU9wLiN2YOSDoYuIsM8J+k/3f1PJS0S4zcqM5slqVrSEndfIClb0vfCVjUUgTSM+yVtdfdOSXL3LwPXkyn+UdJDklj4PEbu/o67J/q/fF9SRch6Yu5aSb9398/cvUvSv6nvgyPOwt1b3P3j/n9/rb6AMCtsVfFnZhWS/kLS9tC1ZAozK5L055JqJMndu9z9D2Gryhg5ks4zsxxJUyT9X+B6hiCQhjFP0p+Z2Qdm9t9mdk3oguLOzKokNbv7p6FryWB3SfqP0EXE2CxJTWd8/YUIVkkxs0pJV0n6IGwlGeGf1PcBuzd0IRnkYknHJO3oX+qw3cymhi4q7ty9WX0zsUcktUhqc/d3wlY1VE7oAs5VZrZL0oXDPPWY+sa9VH3TW9dI+rmZXeKT/MiDUcbsUfVN12OQs42bu/+y/3seU9/U6stR1obJw8wKJb0m6W/cvT10PXFmZrdI+tLd/8fMloWuJ4PkSFosaYO7f2Bmz0n6saS/C1tWvJlZifpmey6W9AdJ/25mq9z9Z2Er+2ME0jRx9xtHes7M7pf0en8A/Y2Z9Uqapr5PfpPWSGNmZgvV90b61Mykvmnnj83sWnc/GmGJsXS2vzVJMrO/lnSLpOWT/UPPKJolfeuMryv6H8MozCxXfWH0ZXd/PXQ9GeDbkr5rZislFUi6wMx+5u6rAtcVd19I+sLdT3fgX1VfIMXZ3Sip0d2PSZKZvS7pekmxCqRM2YfxhqQbJMnM5knKk3Q8aEUx5u773L3c3SvdvVJ9F6XFhNHRmdnN6psW/K67fxO6npj7UNJcM7vYzPLUt+j/zcA1xZ71fUqskXTQ3f8hdD2ZwN0fcfeK/uvZ9yTtJoyOrv+a32Rmf9L/0HJJdQFLyhRHJC01syn979fliuFmMDqkYdRKqjWz/ZK6JH2fzhXS5CeS8iX9qr+7/L673xe2pHhy94SZrZf0X+rbhVrr7gcCl5UJvi1ptaR9Zvbb/scedfedAWvCuWuDpJf7PzR+Jmlt4Hpir395w6uSPlbf0q1PJP00bFVDcacmAAAABMWUPQAAAIIikAIAACAoAikAAACCIpACAAAgKAIpAAAAgiKQAgAAICgCKQAAAIIikAIAACAoAikABGJml5pZq5kt7v96ppkdM7NlgUsDgEhxpyYACMjM1kn6gaQlkn4haZ+7/yhsVQAQLQIpAARmZm9KuliSS7rG3TsDlwQAkWLKHgDC+xdJCyS9QBgFMBnRIQWAgMysUNKnkn4t6TuSFrp7a9iqACBaBFIACMjMaiQVuvsdZvZTScXufnvougAgSkzZA0AgZlYl6WZJ9/c/9LeSFpvZX4WrCgCiR4cUAAAAQdEhBQAAQFAEUgAAAARFIAUAAEBQBFIAAAAERSAFAABAUARSAAAABEUgBQAAQFAEUgAAAARFIAUAAEBQ/w9ROaTOCQ9sZgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 1, figsize=(10, 10))\n",
    "\n",
    "for target in set(y_train):\n",
    "    pd.DataFrame(\n",
    "        x_train_2d[\n",
    "            y_train == target\n",
    "        ],\n",
    "        columns=['x', 'y']\n",
    "    ).sample(n=40).plot(\n",
    "        kind='scatter',\n",
    "        x='x',\n",
    "        y='y',\n",
    "        marker=f'${target}$',\n",
    "        s=64,\n",
    "        color='k',\n",
    "        alpha='0.75',\n",
    "        ax=ax,\n",
    "    )\n",
    "    \n",
    "ax.set_title('PCA Digits')\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "scaler = MinMaxScaler(feature_range=(0, 16))\n",
    "\n",
    "x_train_ipca = pca.inverse_transform(x_train_2d) \n",
    "x_test_ipca = pca.inverse_transform(x_test_2d) \n",
    "\n",
    "x_train_ipca = scaler.fit_transform(x_train_ipca)\n",
    "x_test_ipca = scaler.fit_transform(x_test_ipca)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:16: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  app.launch_new_instance()\n"
     ]
    },
    {
     "data": {
      "image/png": "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kV9s5Bcb+cVGfvFkXSQlpfQjST8qeC4oCPnFRn6xkV9s5Bcb+cVGfrGRXyw1vXLmjBkzsuo8F5jftm2baw5f+tKXXPU33XSTq94j92Kce3gv9ltru3btyqrzXBDUe3HWW2+91VXf2trqqvdYt26dqz734rlFyd1Wdu/enT2m92LYTzzxhKt+0qRJrnqPV155xVX/8ssvFzSTPE8//XRWXXNzc/aY3ovXd3R0uOonTizuRHIbN2501XvzrrXcde3Z/g45xHcuuH/4h39w1b/73e921XvkPp/38LwvKMLJJ5+cVefJL/c1dY8/+IM/cDJ1+xAAAA9iSURBVNX/8z//s6veY8WKFa76//u//ytoJnmWLFmSVTd8+PDsMUeNGuWaw7x581z13/jGN1z1HocddpirfuzYsQXNJM9tt92WVTdy5MjsMceMGeOaw+c//3lX/WWXXeaq9zj22GMHLupj/PjxNVkuZx8FAAAAgBKjKQQAAACAEqMpBAAAAIASoykEAAAAgBKjKQQAAACAEqMpBAAAAIASoykEAAAAgBKjKQQAAACAEqMpBAAAAIASoykEAAAAgBIbVsvBnnnmmay65ubm7DGvueYa1xwOO+wwV31TU5Or/qmnnsquffzxx11j796921Vfa8OHD8+qO+SQ/N8l3H///a45vPzyy676E0880VV/1113Zde+9NJLrrG9z71ay83FzLLH3LBhg2sO3ufwuHHjXPVr164tbC5HHHGEq77Wjj766Ky6LVu2ZI+5evVq1xyee+45V/2cOXNc9V/96ldd9R71zq+I7e+OO+5wzcG7zzrttNNc9bfeemt27caNG11jjxo1ylVfa7/97W+z6g499NDsMc8//3zXHDzbtuTf/j772c9m1z788MOusev9/qWI/ec555zjmsP27dtd9du2bXPVT5gwIbt26tSprrFHjBjhqq+1yZMnZ9Vt2rQpe8yrrrrKNQfvc3jz5s2uek8mp5xyimtsz36pPxwpBAAAAIASoykEAAAAgBKjKQQAAACAEhuwKTSzY81sqZk9amYrzeyS12NiqA3yi438YiO/2MgvNvKLjfxiI794ck40s1PS5Smlh81snKSHzOyelNKjBc8NtUF+sZFfbOQXG/nFRn6xkV9s5BfMgEcKU0obUkoPV/+/VdIqSROLnhhqg/xiI7/YyC828ouN/GIjv9jILx7X3xSaWauk6ZJ+WcRkUCzyi438YiO/2MgvNvKLjfxiI78YsptCMxsr6buS2lNKvovpoO7ILzbyi438YiO/2MgvNvKLjfziyGoKzWy4KoF+K6X0vWKnhFojv9jILzbyi438YiO/2MgvNvKLJefsoybpRkmrUkrXFD8l1BL5xUZ+sZFfbOQXG/nFRn6xkV88OUcKZ0g6T9J7zayrevtAwfNC7ZBfbOQXG/nFRn6xkV9s5Bcb+QUz4CUpUko/l2Q5g61YsSJroStXrsyqk6SRI0dm10pSR0eHq/6QQ1zn2tEDDzyQXfviiy+6xh4zZoyrPocnv97e3qwx77jjjuzlV35RlG/27Nmu+q1bt7rqV69enV07duxY19i7d+921efw5Je7/CeeeOJgptSvqVOnuup37drlqn/++eeza735pZRc9ZljZueX67rrrsuu9W5/b3rTm1z1a9euddW/8MIL2bWTJk1yjf3yyy+76nN48nvmmWeyxvTk53XZZZe56nt6elz1jzzySHat97W73tvffffdlzXmxz72sezle7c/z/qVpE2bNrnq77rrruzabdu2ucYePny4qz6HJ7+3v/3tWWNOmDAhe/k7duzIrpX827b3OX/MMcdk1x555JGuseu9/zz99NOzxnzb297mWX52rSS1tbW56r1OOOGE7NqJE30nafW+Fz4QX0cEAAAAABhSaAoBAAAAoMRoCgEAAACgxGgKAQAAAKDEaAoBAAAAoMRoCgEAAACgxGgKAQAAAKDEaAoBAAAAoMRoCgEAAACgxGgKAQAAAKDEaAoBAAAAoMQspXRQA/T29v5ugJaWlqzHnHfeednjDxs2zDWfSy+91FU/cuRIV/3Xvva17Np169a5xv72t7+dVdfT0/O7/zc3N5trIXsZTH5XX331wSyyX4cddpirfsSIEa76F198Mbt21KhRrrEvueSSrLp653fvvfdmj9/U1OSaz+jRo131w4cPd9Vv27Ytu/bVV191jT1jxoysunrnd/7552ePv2PHDtd8HnnkEVe9d/ubNGlSdu3UqVNdY3/xi1/Mqqt3fhdddFH2+N7X5+OOO85V793HPf7449m13n35l7/85ay6euc3bty47PG9+X3kIx9x1Xv3tzfeeGN2bXNzs2vs3Pc79c7P87pg5pve7bff7qr3+vCHP5xd65177mtxvfPbuXPnwSyy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\n",
      "text/plain": [
       "<Figure size 1008x360 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random \n",
    "\n",
    "fig, axs = plt.subplots(2, 8, figsize=(14, 5))\n",
    "\n",
    "for i in range(8):\n",
    "    \n",
    "    rand = random.choice(range(y_train.shape[0]))\n",
    "\n",
    "    img_orig = x_train[rand]\n",
    "    img_comp = x_train_ipca[rand]\n",
    "    \n",
    "    display_img(img_orig, y_train[rand], axs[0][i], vmin=None, vmax=None)\n",
    "    display_img(img_comp, y_train[rand], axs[1][i], vmin=None, vmax=None)\n",
    "\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "scaler = StandardScaler()\n",
    "\n",
    "pca = PCA()\n",
    "\n",
    "x_train_scaled = scaler.fit_transform(x_train)\n",
    "pca.fit(x_train_scaled)\n",
    "\n",
    "df_explained_variance_ratio = pd.DataFrame(\n",
    "    [\n",
    "        (component, explained_variance_ratio) \n",
    "        for component, explained_variance_ratio in enumerate(pca.explained_variance_ratio_, 1)\n",
    "    ],\n",
    "    columns=['component', 'explained_variance_ratio']\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:8: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  \n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 1, figsize=(14, 5))\n",
    "\n",
    "df_explained_variance_ratio.set_index('component')['explained_variance_ratio'].plot(\n",
    "    kind='bar',\n",
    "    ax=ax\n",
    ")\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "scaler = StandardScaler()\n",
    "pca = PCA(n_components=15)\n",
    "\n",
    "x_train_scaled = scaler.fit_transform(x_train)\n",
    "x_test_scaled = scaler.transform(x_test)\n",
    "\n",
    "x_train_pca = pca.fit_transform(x_train_scaled)\n",
    "x_test_pca = pca.transform(x_test_scaled)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "scaler = MinMaxScaler(feature_range=(0, 16))\n",
    "\n",
    "x_train_ipca = pca.inverse_transform(x_train_pca) \n",
    "x_test_ipca = pca.inverse_transform(x_test_pca) \n",
    "\n",
    "x_train_ipca = scaler.fit_transform(x_train_ipca)\n",
    "x_test_ipca = scaler.fit_transform(x_test_ipca)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:16: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  app.launch_new_instance()\n"
     ]
    },
    {
     "data": {
      "image/png": "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Pvlk1xyefPJJV/0999zjqj/nnHOyax966CHX2EcddZSrvt5GjRqVVffUU09lj3n77be75rB8ue92ROPHj3fVn3XWWdm1v/71r11jH3300a76ehs5cmRW3V577ZU95ujRo11zeP311131l156qav+1FNPza499NBDXWM/8sgjrvp6mzBhQlbd3nvvnT1m7j6513333eeq9z7/TZs2LbvWu2/ec889XfX1lrv9Pfvss9ljPvroo645ePdBixYtctXfeeed2bXe/I4//nhXfb3lPv+9/PLL2WOuX7/eNYfbbrvNVf+rX/3KVf+pT30qu9Z7PDlu3DhXfb3l5rdgwYLsMSdNmuSaw+TJk131zz//vKv+3e9+d3bt/PnzXWPvs88+rvrt4eWjAAAAAFBhNIUAAAAAUGE0hQAAAABQYTSFAAAAAFBhNIUAAAAAUGE0hQAAAABQYTSFAAAAAFBhNIUAAAAAUGE0hQAAAABQYTSFAAAAAFBhg+s5WE9PT1bdggULssc866yzXHM4/PDDXfXHHHOMq37EiBHZtY8//rhr7HHjxrnq6+25557Lqlu0aFH2mLfccotrDhs3bnTVDxs2zFX/2muvZde+/PLLrrH32WcfV329rV+/Pqtu+PDh2WNOmzbNNQfP+pWklpYWV/3EiROzazdt2uQae+zYsa76envxxRez6tatW5c9pvcxuXnzZle9dx937LHHuuo93v72t5c2do7u7u6sumeeeSZ7zHe9612uOdx4442u+re+9a2u+pNOOim71vNcKUkjR4501dfbCy+8kFW3bNmy7DH32msv1xxWrVrlql+5cqWr/t57782uzV0fvUaNGuWqr7fc578hQ4Zkj3nQQQe55rB06VJX/bPPPuuqP/roo7NrH3zwQdfYe++9t6u+3nL3n8uXL88ec9KkSa45vPTSS6567/a9Zs2a0sau1/MfZwoBAAAAoMJoCgEAAACgwrKaQjMbYWbXmtkKM1tuZu8pe2KoH/KLjfxiI7/YyC828ouN/GIjv1hy31N4maRbU0ofM7OhknwvdkWjkV9s5Bcb+cVGfrGRX2zkFxv5BdJvU2hmLZJOkjRDklJKGyX5rgaChiG/2MgvNvKLjfxiI7/YyC828osn5+WjEyU9LWmOmS0xsyvMzHfJRzQS+cVGfrGRX2zkFxv5xUZ+sZFfMDlN4WBJR0m6PKU0VdJLkr5Y6qxQT+QXG/nFRn6xkV9s5Bcb+cVGfsHkNIVrJK1JKfXe4OZaFSEjBvKLjfxiI7/YyC828ouN/GIjv2D6bQpTSuskPWFm76h96WRJD5c6K9QN+cVGfrGRX2zkFxv5xUZ+sZFfPLlXH/0HSVfXrhz0mKRPlTcllID8YiO/2MgvNvKLjfxiI7/YyC+QrKYwpdQp6eiS54KSkF9s5Bcb+cVGfrGRX2zkFxv5xZJ7pjDLmDFjsure8pa3ZI/5ne98xzWHSy+91FW/fv16V/2//Mu/ZNdu3rzZNfYee+zhqq+3UaNGZdUNG5Z/8agf/ehHrjnMnTvXVb/XXr5b3syZMye79v7773eN/fLLL7vq6+3AAw/MqsvNWZJeeeUV1xz+53/+x1U/cuRIV/2SJUuya1evXu0aO6Xkqq+33Pw2bdqUPeYvf/lL1xz+5m/+xlV/3nnnuepzf0dJWrBggWvsoUOHuurrbfz48Vl1e++9d/aYixcvds3hwgsvdNW/9NJLrnrPPnH06NGusT3PK2UYO3ZsVt3gwfmHTbnHRL2OP/54V/1//dd/uerXrl2bXbvbbjmXnPiTF1980VVfb7mPN8/xp/c5pK2tzVW///77u+o981m6dKlrbM/jugy5xyWTJ0/OHvPggw92zcH7/Ldo0SJX/c033+yq99h3333rMo5vqwcAAAAADCg0hQAAAABQYTSFAAAAAFBhNIUAAAAAUGE0hQAAAABQYTSFAAAAAFBhNIUAAAAAUGE0hQAAAABQYTSFAAAAAFBhNIUAAAAAUGGWUtqlAXp6enZtAOySlpYW25WfJ7/GIr/YyC828ouN/GIjv9jIL7Zt5ceZQgAAAACoMJpCAAAAAKiwXX75KAAAAAAgLs4UAgAAAECFldIUmtlpZvaIma00sy+WsYxmYWZdZvYbM+s0s/sbPZ96IL/YyC828ouN/GIjv9jILzbya6y6v3zUzAZJ+q2kaZLWSLpP0lkppYfruqAmYWZdko5OKT3T6LnUA/nFRn6xkV9s5Bcb+cVGfrGRX+OVcabwWEkrU0qPpZQ2Spor6YwSloNykF9s5Bcb+cVGfrGRX2zkFxv5NVgZTeEYSU/0+f+a2tcGqiRpgZk9YGafbvRk6oD8YiO/2MgvNvKLjfxiI7/YyK/BBjd6AgPAiSmltWY2UtJCM1uRUrqz0ZNCNvKLjfxiI7/YyC828ouN/GJruvzKOFO4VtK4Pv8fW/vagJRSWlv7/AdJ16s4/R0Z+cVGfrGRX2zkFxv5xUZ+sZFfg5XRFN4n6WAzm2hmQyWdKenGEpbTcGY2zMyG9/5b0qmSljZ2VruM/GIjv9jILzbyi438YiO/2Mivwer+8tGU0iYzO1/SfEmDJF2ZUlpW7+U0iVGSrjczqViXP0wp3drYKe0a8iO/QMgvNvKLjfxiI7/YyC+2psyv7rekAAAAAADEUcrN6wEAAAAAMdAUAgAAAECF0RQCAAAAQIXRFAIAAABAhdEUAgAAAECF0RQCAAAAQIXRFAIAAABAhdEUAgAAAECF/X+lZNvkuaVS7wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1008x360 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random \n",
    "\n",
    "fig, axs = plt.subplots(2, 8, figsize=(14, 5))\n",
    "\n",
    "for i in range(8):\n",
    "    \n",
    "    rand = random.choice(range(y_train.shape[0]))\n",
    "\n",
    "    img_orig = x_train[rand]\n",
    "    img_comp = x_train_ipca[rand]\n",
    "    \n",
    "    display_img(img_orig, y_train[rand], axs[0][i], vmin=None, vmax=None)\n",
    "    display_img(img_comp, y_train[rand], axs[1][i], vmin=None, vmax=None)\n",
    "\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=5)\n",
    "clf.fit(x_train_ipca, y_train)\n",
    "\n",
    "y_train_pred = clf.predict(x_train_ipca)\n",
    "y_test_pred = clf.predict(x_test_ipca)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 96.9% [train score: 97.9%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [train score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred)\n",
    "    )\n",
    "    \n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# NeighborhoodComponentsAnalysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.neighbors import NeighborhoodComponentsAnalysis\n",
    "\n",
    "nca = NeighborhoodComponentsAnalysis(n_components=2)\n",
    "\n",
    "x_train_nca = nca.fit_transform(x_train, y_train)\n",
    "x_test_nca = nca.transform(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:22: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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Vxevv7KYwBIRERGRrjCBJSIiIiJdYQJLRERERLrCBJaIiIiIdIUJLBERERHpChNYIiIiItIVJrBEREREpCtMYImIiIhIV5jAEhEREZGuMIElIiIiIl1hAktEREREusIEloiIiIh0hQksEREREekKE1giIiIi0hUmsERERESkK0xgiYiIiEhXmMASERERka4wgSUiIiIiXWECS0RERES6MkjtAIiIiJwpKyvDgQMH0NDQACEEduzYoXZIRKQBTGCJiEizCgsLUVRUhN7eXgwaxD9ZRCRjCQEREWmW0WjE/v37MWXKFLVDISIN4dtZIiLSrPDwcLVDICIN4ggsEREREekKE1giIiIi0hUmsERERESkK0xgKaBUV1djyZIlyMrKUjsUIvKB4uJirFq1CufOnUNHRwfS09ORl5endlhEpDJO4qKA0dvbi82bN6OiogK9vb1qh0NEPtDR0QGTyYQRI0YAANra2mAymVSOiojUxgSWAkZBQQGqqqoQFxendihE5CPJyclITk5WOwwi0hiWEFBAqK2txb59+zBv3jxER0erHQ4REREpiAks6Z4kScjMzERcXBwWLFigdjhERESkMCawpHtHjhxBcXExoqKisHXrVjQ2NqKxsRG7du1SOzQiIiJSAGtgSfeEEBg3bhxMJhPKy8vR1dUFADh16pTKkRGRp06dOoXCwkI0NzcjIiICc+fOxfTp09UOi4g0ggks6V5KSgpSUlKsXy9evBiSJOGVV15RMSoi8kZ2djZCQkIwevRo1NTU4JlnnkF2djaSkpLUDo2INIAJLAWchIQEtUMgogEMNMK6adMmjB8/HiEhIWhpacH8+fNx6NAhJrBEBIAJLAWgtWvXqh0CEQ1goBHWxMRE67Z1dXVob29HbGysWuESkcYwgSUiIr9zdYS1paUFmzZtQmxsLObPn69StESkNUxgiYjI71wZYb148SKMRiMuX76MnJwc9ngmIismsEREpBpnI6ytra1YsWIFmpqasH37dowdO1bFKIlIa5jAEhGRKvobYV23bh0qKysxZswY5OfnAwCSkpLw0EMPqRUuEWkIE1giIvK7gUZYhw0bhilTpgAATCZTn3+JiJjAEhGR3w00wpqRkaFidESkdVxKllxWXV2NJUuWICsrS+1QiEjnLCOs0dHRMJlM1g8iIldwBJZc0tvbi82bN6OiogK9vb1q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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 1, figsize=(10, 10))\n",
    "\n",
    "for target in set(y_train):\n",
    "    pd.DataFrame(\n",
    "        x_train_nca[\n",
    "            y_train == target\n",
    "        ],\n",
    "        columns=['x', 'y']\n",
    "    ).sample(n=40).plot(\n",
    "        kind='scatter',\n",
    "        x='x',\n",
    "        y='y',\n",
    "        marker=f'${target}$',\n",
    "        s=64,\n",
    "        color='k',\n",
    "        alpha='0.75',\n",
    "        ax=ax,\n",
    "    )\n",
    "    \n",
    "ax.set_title('NeighborhoodComponentsAnalysis Fashion')\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.neighbors import NeighborhoodComponentsAnalysis\n",
    "\n",
    "nca = NeighborhoodComponentsAnalysis(n_components=2)\n",
    "\n",
    "x_train_nca = nca.fit_transform(x_train, y_train)\n",
    "x_test_nca = nca.transform(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 76.2% [train score: 91.0%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=3, weights='uniform')\n",
    "clf.fit(x_train_nca, y_train)\n",
    "\n",
    "y_train_pred = clf.predict(x_train_nca)\n",
    "y_test_pred = clf.predict(x_test_nca)\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [train score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred)\n",
    "    )\n",
    "    \n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 76.9% [train score: 100.0%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=5, weights='distance')\n",
    "clf.fit(x_train_nca, y_train)\n",
    "\n",
    "y_train_pred = clf.predict(x_train_nca)\n",
    "y_test_pred = clf.predict(x_test_nca)\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [train score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred)\n",
    "    )\n",
    "    \n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:8: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  \n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import plot_confusion_matrix\n",
    "\n",
    "fig, ax = plt.subplots(1, 1, figsize=(8, 8))\n",
    "\n",
    "plot_confusion_matrix(clf, x_test_nca, y_test, cmap='Greys', ax=ax)\n",
    "ax.grid(False)\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Digits test accuracy score: 65.6% [train score: 68.7%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "scaler = MinMaxScaler()\n",
    "clf = LogisticRegression(max_iter=1000)\n",
    "\n",
    "x_train_scaled = scaler.fit_transform(x_train_nca)\n",
    "x_test_scaled = scaler.transform(x_test_nca)\n",
    "\n",
    "clf.fit(x_train_scaled, y_train)\n",
    "\n",
    "y_train_pred = clf.predict(x_train_scaled)\n",
    "y_test_pred = clf.predict(x_test_scaled)\n",
    "\n",
    "\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "print(\n",
    "    'Digits test accuracy score: {:.1%} [train score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred)\n",
    "    )\n",
    "    \n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Distances "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x1</th>\n",
       "      <th>x2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   x1  x2\n",
       "0   1   2\n",
       "1   4   6"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "points = pd.DataFrame(\n",
    "    [[1, 2], [4, 6]], columns=['x1', 'x2']\n",
    ")\n",
    "\n",
    "points"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f980e1be1d0>"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.neighbors import DistanceMetric\n",
    "\n",
    "d = [\n",
    "    (p, DistanceMetric.get_metric('minkowski', p=p).pairwise(points)[0][-1])\n",
    "    for p in [1, 2, 10, 50, 100]\n",
    "]\n",
    "\n",
    "pd.DataFrame(d, columns=['P', 'Distance']).set_index('P').plot(\n",
    "    title='Minkowski for different values of p', kind='bar', color='k'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(7.0, 5.0)"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics.pairwise import euclidean_distances, manhattan_distances\n",
    "\n",
    "manhattan_distances(points)[0][-1], euclidean_distances(points)[0][-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:6: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  \n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 2, figsize=(10, 10))\n",
    "\n",
    "display_img(1.0 * digits['data'][0],  f\"{digits['target'][0]} [Original intensity]\", axs[0])\n",
    "display_img(2.0 * digits['data'][0],  f\"{digits['target'][0]} [2x intensity]\", axs[1])\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Manhattan Distances = 294.00, Euclidean Distances = 55.41, Cosine Distances 0.00\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics.pairwise import euclidean_distances, manhattan_distances, cosine_distances\n",
    "\n",
    "d0 = manhattan_distances(\n",
    "    [1.0 * digits['data'][0], 2.0 * digits['data'][0]]\n",
    ")[0,1]\n",
    "\n",
    "\n",
    "d1 = euclidean_distances(\n",
    "    [1.0 * digits['data'][0], 2.0 * digits['data'][0]]\n",
    ")[0,1]\n",
    "\n",
    "d2 = cosine_distances(\n",
    "    [1.0 * digits['data'][0], 2.0 * digits['data'][0]]\n",
    ")[0,1]\n",
    "\n",
    "print(\n",
    "    f'Manhattan Distances = {d0:.2f}, Euclidean Distances = {d1:.2f}, Cosine Distances {d2:.2f}'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Manhattan Distances = 294.00, Euclidean Distances = 55.41, Cosine Distances 0.00\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics.pairwise import paired_distances\n",
    "\n",
    "d0 = paired_distances([1.0 * digits['data'][0]], [2.0 * digits['data'][0]], metric='manhattan')[0]\n",
    "d1 = paired_distances([1.0 * digits['data'][0]], [2.0 * digits['data'][0]], metric='euclidean')[0]\n",
    "d2 = paired_distances([1.0 * digits['data'][0]], [2.0 * digits['data'][0]], metric='cosine')[0]\n",
    "\n",
    "print(\n",
    "    f'Manhattan Distances = {d0:.2f}, Euclidean Distances = {d1:.2f}, Cosine Distances {d2:.2f}'\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pixel Selection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_selection import f_classif\n",
    "from sklearn.feature_selection import mutual_info_classif\n",
    "\n",
    "mi = mutual_info_classif(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Pixels kept when 75% removed')"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "percent_to_remove = 75\n",
    "\n",
    "mi_threshold = np.quantile(mi, 0.01 * percent_to_remove)\n",
    "\n",
    "informative_pixels = (mi >= mi_threshold).reshape((8, 8))\n",
    "\n",
    "plt.imshow(informative_pixels, cmap='Greys')\n",
    "plt.title(f'Pixels kept when {percent_to_remove}% removed')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:19: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 2, figsize=(12, 8))\n",
    "\n",
    "mi_threshold = np.quantile(mi, 0.01 * percent_to_remove)\n",
    "\n",
    "zeros = np.zeros(8*8)\n",
    "\n",
    "informative_pixels = (mi >= mi_threshold).reshape((8, 8))\n",
    "\n",
    "axs[0].imshow(informative_pixels, cmap='Greys')\n",
    "axs[0].set_title(f'Pixels kept when {percent_to_remove}% removed')\n",
    "\n",
    "informative_image = np.copy(x_train[1]) \n",
    "informative_image[mi < mi_threshold] = 0\n",
    "informative_image = informative_image.reshape((8, 8))\n",
    "\n",
    "axs[1].imshow(informative_image, cmap='Greys')\n",
    "axs[1].set_title(f'Pixels kept whe {percent_to_remove}% removed')\n",
    "    \n",
    "fig.show()    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_selection import mutual_info_classif\n",
    "from sklearn.feature_selection import f_classif\n",
    "from sklearn.feature_selection import SelectPercentile\n",
    "\n",
    "percent_to_keep = 100 - percent_to_remove\n",
    "selector = SelectPercentile(mutual_info_classif, percentile=percent_to_keep)\n",
    "\n",
    "x_train_mi = selector.fit_transform(x_train, y_train)\n",
    "x_test_mi = selector.transform(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Shift vs Pullover test accuracy score: 94.7% [train accuracy score: 96.1%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "clf = KNeighborsClassifier(n_neighbors=5, metric='cosine', n_jobs=-1)\n",
    "\n",
    "clf.fit(x_train_mi, y_train)\n",
    "\n",
    "y_train_pred = clf.predict(x_train_mi)\n",
    "y_test_pred = clf.predict(x_test_mi)\n",
    "\n",
    "\n",
    "print(\n",
    "    'Shift vs Pullover test accuracy score: {:.1%} [train accuracy score: {:.1%}]'.format(\n",
    "        accuracy_score(y_test, y_test_pred),\n",
    "        accuracy_score(y_train, y_train_pred),\n",
    "    )\n",
    "    \n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
